刷水ing…
AC code:
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N=501;
const int INF=1<<29;
int n,m,x1,y1,x2,y2,S,T;
int mx[5]={0,1,-1,0,0},my[5]={0,0,0,1,-1},minw[N*N];
bool inq[N*N];
char s[N][N];
struct Data{
int v,w;
Data() {}
Data(int v,int w):v(v),w(w) {}
};
vector<Data> G[N*N];
int Num(int x,int y){
return (x-1)*m+y;
}
int Abs(int x){
return x<0?-x:x;
}
void SPFA(){
queue<int> Q;
for(int i=1;i<=Num(n,m);i++) minw[i]=INF;
minw[S]=0;Q.push(S);
while(!Q.empty()){
int x=Q.front();
Q.pop();inq[x]=0;
for(int i=0;i<(int)G[x].size();i++){
int v=G[x][i].v,w=G[x][i].w;
if(minw[x]+w>=minw[v]) continue;
minw[v]=minw[x]+w;
if(!inq[v]){
inq[v]=1;
Q.push(v);
}
}
}
for(int i=1;i<=Num(n,m);i++) G[i].clear();
}
int main(){
while(1){
scanf("%d%d",&n,&m);
if(n==0&&m==0) break;
for(int i=1;i<=n;i++) scanf("%s",s[i]);
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
for(int k=1;k<=4;k++){
int ii=i+mx[k],jj=j+my[k];
if(ii<1||ii>n||jj<0||jj>=m) continue;
G[Num(i,j+1)].push_back(Data(Num(ii,jj+1),s[i][j]==s[ii][jj]?0:1));
}
}
}
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
S=Num(x1+1,y1+1);T=Num(x2+1,y2+1);
SPFA();
printf("%d\n",minw[T]);
}
return 0;
}