题目大意
一个n*n的01矩阵,0表示可以走,1表示不可以走,只可以上下左右走。求从(a,b)走到(c,d)最少的格子数。
样例输入
5 01111 00111 10001 11101 111001 1 5 5
样例输出
9
思路
广搜
C++代码
#include<cstdio>
#include<cstring>
#define sr c=getchar()
#define input read()
#define pd (c<'0'||c>'9')
#define fk f=f*10+c-48
#define ps if (c=='-') d=-1
using namespace std;int n;char c;bool a[1005][1005];int father[1000001],state[1000001][4];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};//四个方向扩展
int x1,x2,y1,y2;
int read()
{
int d=1,f=0;char c;
while (sr,pd) ps;fk;
while (sr,!pd) fk;
return d*f;
}
void bfs()
{
int head=0,tail=1;state[1][3]=1;father[1]=0;a[1][1]=1;
do
{
head++;
for (int i=0;i<4;i++)
{
int x=state[head][1]+dx[i];
int y=state[head][2]+dy[i];
if (x>=1&&x<=n&&y>=1&&y<=n&&a[x][y]==0)//判断是否超出矩阵和能否走
{
tail++;
father[tail]=head;
state[tail][1]=x;//存横坐标
state[tail][2]=y;//存纵坐标
state[tail][3]=state[head][3]+1;//到这个格子走的格子数
a[x][y]=1;//封路
if(x==x2&&y==y2)//到达目标位置
{
printf("%d",state[head][3]);//输出
return;
}
}
}
}while(head<tail);
}
int main()
{
scanf("%d\n",&n);char c;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
c=getchar();
if (c=='1') a[i][j]=true;
}
c=getchar();
}
state[1][1]=input;state[1][2]=input;x2=input;y2=input;
bfs();
}