双向广搜,#5 WA,哪里挂了?
#include<bits/stdc++.h>
using namespace std;
int n,m,b[2][505][505],sx,sy,ex,ey,x,y,xx,yy,dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
bool k,ok;
deque<pair<int,int> > d[2];
char a[505][505];
int main()
{
cin>>n>>m;
while (n || m)
{
memset(b,-1,sizeof(b));
for (int i=0;i<n;++i)
for (int j=0;j<m;++j)
cin>>a[i][j];
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if (sx==ex && sy==ey)
{
cout<<"0\n";
continue;
}
b[0][sx][sy]=0;
d[0].push_back(make_pair(sx,sy));
b[1][ex][ey]=0;
d[1].push_back(make_pair(ex,ey));
while (!d[0].empty() && !d[1].empty())
{
if (d[0].size()<=d[1].size())
k=0;
else
k=1;
x=d[k].front().first;
y=d[k].front().second;
d[k].pop_front();
ok=0;
for (int i=0;i<4;++i)
{
xx=x+dx[i];
yy=y+dy[i];
if (0<=xx && xx<n && 0<=yy && yy<m && b[k][xx][yy]==-1)
{
if (a[xx][yy]==a[x][y])
{
b[k][xx][yy]=b[k][x][y];
d[k].push_front(make_pair(xx,yy));
}
else
{
b[k][xx][yy]=b[k][x][y]+1;
d[k].push_back(make_pair(xx,yy));
}
if (b[1-k][xx][yy]!=-1)
{
cout<<b[k][xx][yy]+b[1-k][xx][yy]<<'\n';
ok=1;
break;
}
}
}
if (ok)
break;
}
d[0].clear();
d[1].clear();
scanf("%d%d",&n,&m);
}
}