Oliver的救援(广搜练习题)

来源:互联网 发布:python http 断点续传 编辑:程序博客网 时间:2024/05/16 10:01

题目大意


一个n*n的01矩阵,0表示可以走,1表示不可以走,只可以上下左右走。求从(a,b)走到(c,d)最少的格子数。


样例输入


50111100111100011110111100
1 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=-1using 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();}


原创粉丝点击