裸的最短路。。。
我tm比赛时还爆内存了
然后是发现把坐标改点时写错了。。。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct arr{
int x,y,w,next;
}edge[1500000];
int ls[600000];
int dis[600002];
int v[600002];
int n,m;
int s,t;
int edge_m=0;
void add(int x,int y,int w)
{
edge[++edge_m]=(arr){x,y,w,ls[x]};ls[x]=edge_m;
}
void spfa()
{
for (int i=1;i<=n*m;i++) dis[i]=2000000000;
memset(v,0,sizeof(v));
queue<int> q;
dis[s]=0;
q.push(s);
v[s]=1;
do{
int x=q.front();
for (int i=ls[x];i;i=edge[i].next)
if (dis[edge[i].y]>dis[x]+edge[i].w)
{
dis[edge[i].y]=dis[x]+edge[i].w;
if (!v[edge[i].y])
{
v[edge[i].y]=1;
q.push(edge[i].y);
}
}
v[x]=0;
q.pop();
}while (!q.empty());
}
char c[1000][1000];
int dx[5],dy[5];
int main()
{
scanf("%d%d",&n,&m);
dx[1]=0; dx[2]=0; dx[3]=1; dx[4]=-1;
dy[1]=1; dy[2]=-1; dy[3]=0; dy[4]=0;
while ((n!=0)||(m!=0))
{
scanf("\n");
memset(c,0,sizeof(c));
memset(edge,0,sizeof(edge));
memset(ls,0,sizeof(ls));
edge_m=0;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
c[i][j]=getchar();
scanf("\n");
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=1;k<=4;k++)
{
int x=i+dx[k],y=j+dy[k];
if ((x<1)||(x>n)||(y<1)||(y>m)) continue;
if (c[i][j]==c[x][y]) add((i-1)*m+j,(x-1)*m+y,0);
else add((i-1)*m+j,(x-1)*m+y,1);
}
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;x2++;y1++;y2++;
s=(x1-1)*m+y1;
t=(x2-1)*m+y2;
spfa();
printf("%d\n",dis[t]);
scanf("%d%d",&n,&m);
}
}