- 对于上一个迷宫的问题也可使用广度优先搜索(Breadth First Search,BFS),也称作宽度优先搜索。
- 深度优先搜索的方法是一直搜索下去,直到走不通,再回到原地。而广度优先搜索是是“一层一层”的扩展进行搜索。最开始假设还是(1,1)处,一步可以到达的点有(1,2)和(2,1)
- 但是还没有找到目标,继续通过这两个(1,2)、(2,1)点往下走。之后,他能走到哪个点呢?(2,2),通过(2,1)还可以到(3,1),并且都是用2步,这里依然需要使用数组进行标记这个点是否走过。
- 然后依次类推继续搜索;
- 在上面的过程中,需要使用个结构体实现队列,
struct note{ int x; int y; int s;//记录步数 }
- 从(1,1)开始,先尝试往右走到了(1,2),对其进行判断是否越界或为障碍物或已经走过(使用前边介绍的book数组标记)。
-从(1,1)也可以到达(2,1)。
- 出队时使用head++就可以啦!;
- 代码:
#include<iostream> using namespace std; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; struct note{ int x; int y; int f; int s; }; int main(){ struct note que[2501]; int head,tail; int sx,sy,tx,ty,q,p,m,n,flag; int a[51][51]={0}; int book[51][51]={0}; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } cin>>sx>>sy>>p>>q; head=1; tail=1; que[tail].x=1; que[tail].y=1; que[tail].s=0; tail++; book[sx][sy]=1; flag=0; while(head<tail){ for(int k=0;k<=3;k++){ tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(tx<1||ty<1||tx>n||ty>m) continue; if(a[tx][ty]==0&&book[tx][ty]==0){ book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; que[tail].f=head; que[tail].s=que[head].s+1; tail++; } if(tx==p&&ty==q){ flag=1; break; } } if(flag) break; head++; } cout<<que[tail-1].s<<endl; return 0; }
测试数据:
5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3
7