c++ 迷宫搜索(宽搜)
c++ 迷宫搜索(宽搜)
题目描述
迷宫的游戏,相信大家都听过,现在我们用一个n*m的矩阵表示一个迷宫,例如:
S.X.
..X.
..XD
....
其中‘S’表示起点,‘D’表示终点,‘X’表示该位置为墙,不可以走,‘.’表示可以通行。每次只能向“上下左右”四个方向移动一步。
你的任务是判断在x步内(小于等于x),能否从起点走到终点。
输入
第一行输入三个数n m x,分别表示迷宫的尺寸和步数。(1 < n,m < 7; 0 < x < 50)
接下来输入一个n*m的矩阵,描述迷宫的状态。
输出
判断是否能在x步内从起点走到终点,如果可以,输出“YES”,否则输出“NO”。
样例输入
3 4 5
S.X.
..X.
...D
样例输出
YES
废话不多说,直接上代码
AC代码
#include <bits/stdc++.h>
using namespace std;
int n,m,z,f,e;//e是入队的下标 f 是出队的下标
struct point {//结构体
int x,y,step;
};
int dx[4]= {1,-1,0,0};//dx[] + dy[] 代表小人走的4个方向可达的点
int dy[4]= {0,0,-1,1};
point q[100],s,t;//q是队列 s是起点 t是终点
char g[10][10];//整个队列 (迷宫)即二位数组
bool used[10][10];
int main()
{
scanf("%d %d %d",&n,&m,&z);//输入
for(int i=0; i<=n-1; i++) {//输入
scanf("%s",g[i]);//scanf
for(int j=0; j<=m-1; j++) {//获取起点和终点的 x 和 y 坐标
if(g[i][j] == 'S') {
s.x=i,s.y=j,s.step=0;
} else if(g[i][j]=='D')
t.x=i,t.y=j;
}
}
memset(used ,0,sizeof(used)); //memset
q[1]=s,f=1,e=1,used[s.x][s.y]=1;// 把起点入队
////////////////////////////////Strat to BFS///////////////////////////////////////////
while(f<=e) {//保证不越界
point u=q[f++];//选定的元素
for(int i=0; i<4; i++) {
point v;
v.x=u.x+dx[i],v.y=u.y+dy[i],v.step=u.step+1;
if(v.x<0||v.x>=n||v.y<0||v.y>m)continue;//如果出了迷宫
if(used[v.x][v.y]==1)continue;//如果已经走过
if(v.step>z)continue;//如果 步数超过规定
if(g[v.x][v.y]=='X')continue;//如果撞墙
if(v.x==t.x&&v.y==t.y) {//如果找到出口
cout << v.step << endl;//直接输出在退出
cout<<"YES"<<endl;
return 0;
}
e++;//直接入队
q[e]=v;
used[v.x][v.y]=1;
}
}
cout<<"NO"<<endl;
return 0;
}
bfs思路总结:
step1:先找出所有符合规则的数,通过走迷宫的规则和不能穿墙,不能超过迷宫边界,不能超过5步来过滤
step2:将有效的数入队,入队的同时进行比较是否达到终点
step3:达到终点就输出yes