直接转换成最短路
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define INF 0x7fffffff
#define MAXN 510
struct data
{
int v,w,next;
}e[MAXN*MAXN];
int head[MAXN*MAXN];
int cnt;
struct edge
{
int to,len;
}p;
struct cmp
{
bool operator () (const edge a,const edge b)
{
return a.len > b.len;
}
};
int n,m;
int S,T;
int x1,y1,x2,y2;
int dis[MAXN*MAXN],vis[MAXN*MAXN];
char f[MAXN][MAXN];
void link(int u,int v,int w)
{
e[++cnt]=(data){v,w,head[u]};
head[u]=cnt;
}
void Dij(int s)
{
priority_queue<edge,vector<edge>,cmp>q;
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++)
dis[i]=INF;
dis[s]=0;
vis[s]=1;
for (int i=head[s];i;i=e[i].next)
if (dis[e[i].v]>dis[s]+e[i].w)
{
dis[e[i].v]=dis[s]+e[i].w;
p.to=e[i].v;
p.len=dis[p.to];
q.push(p);
}
for (int i=1;i<=n-1;i++)
{
if (q.empty())
break;
p=q.top();
q.pop();
while (vis[p.to] && !q.empty())
p=q.top(),q.pop();
int x=p.to;
vis[x]=1;
for (int j=head[x];j;j=e[j].next)
if (dis[e[j].v]>dis[x]+e[j].w)
{
dis[e[j].v]=dis[x]+e[j].w;
p.to=e[j].v;
p.len=dis[p.to];
q.push(p);
}
}
}
int main()
{
while (scanf("%d%d",&n,&m))
{
if (n+m==0)
break;
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
cnt=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cin>>f[i][j];
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (j<m)
{
if (f[i][j]==f[i][j+1])
link(j+(i-1)*m,j+(i-1)*m+1,0),link(j+(i-1)*m+1,j+(i-1)*m,0);
else
link(j+(i-1)*m,j+(i-1)*m+1,1),link(j+(i-1)*m+1,j+(i-1)*m,1);
}
if (i<n)
{
if (f[i][j]==f[i+1][j])
link(j+(i-1)*m,j+i*m,0),link(j+i*m,j+(i-1)*m,0);
else
link(j+(i-1)*m,j+i*m,1),link(j+i*m,j+(i-1)*m,1);
}
}
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
S=x1*m+y1+1;
T=x2*m+y2+1;
n=n*m;
Dij(S);
printf("%d\n",dis[T]);
}
return 0;
}