//P4554
#include <bits/stdc++.h>
using namespace std;
const int N = 25020;
int Head[N], Leng[N*4], Edge[N*4], Next[N*4], tot;
int n, m, sx, sy, ex, ey, st, ed;
char s[N][N];
int Dis[N];
inline int getpos(int x, int y){
return x * (m + 2) + y;
}
inline void addedge(int u, int v, bool w){
Edge[++tot] = v, Leng[tot] = (w?0:1), Next[tot] = Head[u], Head[u] = tot;
}
void bfs(int s, int e){
memset(Dis, 0x3f, sizeof(Dis));
deque<int> q;
Dis[s] = 0, q.push_back(s);
while(!q.empty()){
int x = q.front(); q.pop_front();
for(int i = Head[x]; i; i = Next[i]){
int y = Edge[i], z = Leng[i];
if(Dis[y] > Dis[x] + z){
Dis[y] = Dis[x] + z;
if(z) q.push_back(y); else q.push_front(y);
}
if(y == e) return;
}
}
return;
}
int main(){
while(scanf("%d%d", &n, &m) && n && m){
memset(Head, 0, sizeof(Head));
memset(Leng, 0, sizeof(Leng));
memset(Edge, 0, sizeof(Edge));
memset(Next, 0, sizeof(Next));
tot = 0;
for(int i = 1; i <= n; ++ i){
scanf("%s", s[i] + 1);
}
scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
st = getpos(sx + 1, sy + 1), ed = getpos(ex + 1, ey + 1);
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= m; ++ j){
addedge(getpos(i, j), getpos(i, j+1), s[i][j] == s[i][j+1]);
addedge(getpos(i, j), getpos(i, j-1), s[i][j] == s[i][j-1]);
addedge(getpos(i, j), getpos(i+1, j), s[i][j] == s[i+1][j]);
addedge(getpos(i, j), getpos(i-1, j), s[i][j] == s[i-1][j]);
}
}
bfs(st, ed);
printf("%d\n", Dis[ed]);
}
return 0;
}
应该不是空间的问题
请不要回复“你可以试试输出中间变量或者参考题解改改”