今天本来想着练一下双向广搜,就来做这道水题,但是第9个点WA了,很难受,请大佬们赐教
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n,x1,y1,x2,y2,mov[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
char mp[1005][1005];
bool book1[1005][1005],book2[1005][1005],flag;
struct node{
int x,y,step;
};
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",mp[i]);
for(int j=n;j>=1;j--)
{
mp[i][j]=mp[i][j-1];
}
}
queue <node> q1,q2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
struct node first;
first.step=0;
first.x=x1;first.y=y1;
q1.push(first);
first.x=x2;first.y=y2;
q2.push(first);
book1[x1][y1]=1;book2[x2][y2]=1;
while(!q1.empty()||!q2.empty())
{
struct node head=q1.front();
q1.pop();
for(int i=0;i<4;i++)
{
int nx=head.x+mov[i][0],ny=head.y+mov[i][1];
if(nx<1||ny<1||nx>n||ny>n||mp[nx][ny]=='1'||book1[nx][ny])continue;
book1[nx][ny]=1;
struct node tail;
tail.step=head.step+1;
tail.x=nx;tail.y=ny;
q1.push(tail);
if(book2[nx][ny])
{
flag=1;
break;
}
}
if(flag)break;
head=q2.front();
q2.pop();
for(int i=0;i<4;i++)
{
int nx=head.x+mov[i][0],ny=head.y+mov[i][1];
if(nx<1||ny<1||nx>n||ny>n||mp[nx][ny]=='1'||book2[nx][ny])continue;
book2[nx][ny]=1;
struct node tail;
tail.step=head.step+1;
tail.x=nx;tail.y=ny;
q2.push(tail);
if(book1[nx][ny])
{
flag=1;
break;
}
}
}
printf("%d",q1.back().step+q2.back().step);
return 0;
}