悟空救我-广度优先搜索模拟
作者:互联网
【问题描述】
唐僧师徒在取经路上再一次走失了,这一次狡猾的妖怪将唐僧藏入了形如迷宫的洞穴中。已知妖怪洞穴是一个n*m的矩形, 其中有一些假山堵路。请根据给出的搜索起点和师傅的位置,计算出以最快速度(经过的格子最少)救出师傅的方法。
输入: 第一行是两个正整数n,m(2<N<10)后面包含n行m列由0, 1组成的矩阵,其中0表示可以走,1表示假山,最后一行四个整数,分别表示搜索的起点和师傅的位置。(迷宫左上角坐标为(1,1))。
输出:一个整数,描述以最快速度救出师傅需要走过的步数。
【样例输入】
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 1
0 0 0 1
1 1 4 3
【样例输出】
7
#include<iostream> using namespace std; int map[10][10], book[10][10]; int m,n,sx,sy,ex,ey,head=1,rear=1; bool flag=false; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; struct node{ int x,y,step; } que[100]; void bfs(){ // 元素入队。 que[rear].x=sx; que[rear].y=sy; que[rear].step=0; rear++; book[sx][sy]=1; while(head<rear){ // 开始搜索。 for(int i=0; i<=3; i++){ // 元素出队。 int x1=que[head].x+dir[i][0]; int y1=que[head].y+dir[i][1]; if(x1>=1&&x1<=m&&y1>=1&&y1<=n&&map[x1][y1]==0&&book[x1][y1]==0){ // 满足上述条件,则进行搜索(元素入队)。 que[rear].x=x1; que[rear].y=y1; que[rear].step=que[head].step+1; // 满足条件的元素才能入队。 book[x1][y1]=1; rear++; } if(x1==ex&&y1==ey){ flag=true; break; } } if(flag) break; head++; } } int main(){ cin>>m>>n; for(int i=1; i<=m; i++){ for(int j=1; j<=n; j++){ cin>>map[i][j]; } } cin>>sx>>sy>>ex>>ey; bfs(); cout<<que[rear-1].step; return 0; }
标签:10,sy,sx,悟空,int,que,模拟,广度,rear 来源: https://www.cnblogs.com/dks0313/p/16542210.html