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

posted @ 2019-07-14 14:43  牛大了的牛大  阅读(1443)  评论(0编辑  收藏  举报