题目描述
给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走
输入
多组测试数据,每组第一行两个正整数,分别为n和m
表示n这个迷宫有n行m列(0<n,m<10)
接着是n行m列,
'#'表示路
‘*’表示墙
‘S’表示起点
‘T’表示终点
输出
每组测试数据输出一个结果,如果能从S走到T,输出“YES”,否则输出“NO”
样例输入
2 2
S*
#T
3 3
S*#
#T
样例输出
YES
NO
思路:这就是一个走迷宫的题目,之前用DFS写过。最近想试试用BFS来写。
广度优先搜索较之深度优先搜索之不同在于,深度优先搜索旨在不管有多少条岔路,先一条路走到底,不成功就返回上一个路口然后就选择下一条岔路,而广度优先搜索旨在面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路,并重复这样的操作。
#include <bits/stdc++.h>
using namespace std;
int vis[15][15];
char mp[15][15];
int n,m,flag;
int step_x[4] = {0,0,-1,1};
int step_y[4] = {1,-1,0,0};
struct state{
int x,y;
};
state st,t;
void bfs()
{
queue<state>q;
state now,next;
q.push(st); //将起点压人队列中
vis[st.x][st.y] = 1;
while(!q.empty()){
now = q.front();
q.pop(); //将队列最前面的弹出。
if(now.x == t.x&&now.y == t.y){
flag = 1;
return ;
}
for(int i=0;i<4;i++){ //四个方向
next.x = now.x + step_x[i];
next.y = now.y + step_y[i];
if(vis[next.x][next.y]==0&&next.x>=1&&next.x<=n&&next.y>=1&&next.y<=m&&mp[next.x][next.y]!='*'){ //判断是否符合条件
q.push(next);
vis[next.x][next.y] = 1;
}
}
}
}
int main(){
while(cin>>n>>m){
//memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
if(mp[i][j]=='S'){
st.x = i;
st.y = j;
}
if(mp[i][j]=='T'){
t.x = i;
t.y = j;
}
}
}
flag = 0;
bfs();
if(flag ==1 ) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}