Vicssia @ 2019-07-11 11:44:43
#include<bits/stdc++.h>
using namespace std;
int n,tot=0;
int ha,la,hb,lb;
int mg[1005][1005];
int head[1000005],dis[1000005],vis[1000005];
struct pp
{
int v,w,nxt;
}e[2000005];
deque <int> q;
int read()
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
void in()
{
memset(head,-1,sizeof(head));
cin>>n;
char c;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
cin>>c;
if(c=='0')
mg[i][j]=1;
if(c=='1')
mg[i][j]=-1;
}
}
cin>>ha>>la>>hb>>lb;
}
void spfa(int s)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
vis[s]=1;
q.push_back(s);
while(!q.empty())
{
int u=q.front();q.pop_front();vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].nxt)
{
int p=e[i].v;
if(dis[p]>dis[u]+e[i].w)
{
dis[p]=dis[u]+e[i].w;
if(!vis[p])
{
vis[p]=1;
if(q.empty()||dis[p]>dis[q.front()])
q.push_back(p);
else
q.push_front(p);
}
}
}
}
}
void add(int u,int v,int w)
{
e[tot].v=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot++;
}
void work()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(mg[i][j]==1)
{
if(mg[i][j+1]==1)
{
add((i-1)*n+j,(i-1)*n+j+1,1);
}
if(mg[i][j-1]==1)
{
add((i-1)*n+j,(i-1)*n+j-1,1);
}
if(mg[i+1][j]==1)
{
add((i-1)*n+j,i*n+j,1);
}
if(mg[i-1][j]==1)
{
add((i-1)*n+j,(i-2)*n+j,1);
}
}
}
}
spfa((ha-1)*3+la);
printf("%d",dis[(hb-1)*3+lb]);
}
int main()
{
in();
work();
return 0;
}
by loris @ 2019-10-20 13:20:11
你的长度。。。。。。