入门OJ 1276【迷宫搜索】
描述
迷宫的游戏,相信大家都听过,现在我们用一个n*m的矩阵表示一个迷宫,例如:
S.X.
..X.
..XD
....
其中‘S’表示起点,‘D’表示终点,‘X’表示该位置为墙,不可以走,‘.’表示可以通行。每次只能向“上下左右”四个方向移动一步。
你的任务是判断在x步内(小于等于x),能否从起点走到终点。
S.X.
..X.
..XD
....
其中‘S’表示起点,‘D’表示终点,‘X’表示该位置为墙,不可以走,‘.’表示可以通行。每次只能向“上下左右”四个方向移动一步。
你的任务是判断在x步内(小于等于x),能否从起点走到终点。
输入输出格式
输入
第一行输入三个数n m x,分别表示迷宫的尺寸和步数。(1 < n,m < 7; 0 < x < 50)
接下来输入一个n*m的矩阵,描述迷宫的状态。
接下来输入一个n*m的矩阵,描述迷宫的状态。
输出
判断是否能在x步内从起点走到终点,如果可以,输出“YES”,否则输出“NO”。
输入输出样例
输入样例1
3 4 5 S.X. ..X. ...D
输出样例1
YES
解题思路
典型的BFS题目,从起点开始搜索,判断出界,判断障碍物,再记得打标记即可。
题解
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,x,sx,sy,ex,ey; 4 char mp[10][10];//存图 5 struct node{ 6 int xx; 7 int yy; 8 int t; 9 node(){} 10 node(int xxx,int yyy,int tt)//构造函数 11 { 12 xx=xxx; 13 yy=yyy; 14 t=tt; 15 } 16 }; 17 queue<node> q; 18 int dir[4][2]={0,1,0,-1,1,0,-1,0};//四方向 19 void dfs(int tx,int ty) 20 { 21 q.push(node(tx,ty,0)); 22 while(!q.empty()) 23 { 24 node head=q.front();//取队首元素 25 q.pop(); 26 if(head.xx==ex&&head.yy==ey)//搜索到了 27 { 28 if(head.t<=x)//步数合法 29 cout<<"YES"; 30 else cout<<"NO";//步数不合法 31 return; 32 } 33 for(int i=0;i<4;i++)//四个方向扩展 34 { 35 int X=head.xx+dir[i][0]; 36 int Y=head.yy+dir[i][1]; 37 if(mp[X][Y]!='X'&&X>=1&&X<=n&&Y>=1&&Y<=m)//障碍与越界 38 { 39 mp[X][Y]='X';//标记 40 q.push(node(X,Y,head.t+1)); 41 } 42 } 43 } 44 cout<<"NO";//没找到 45 } 46 int main() 47 { 48 cin>>n>>m>>x; 49 for(int i=1;i<=n;i++) 50 { 51 for(int j=1;j<=m;j++) 52 { 53 cin>>mp[i][j]; 54 if(mp[i][j]=='S')//起点 55 { 56 sx=i; 57 sy=j; 58 } 59 if(mp[i][j]=='D')//终点 60 { 61 ex=i; 62 ey=j; 63 } 64 } 65 } 66 dfs(sx,sy); 67 }