原题链接:登录—专业IT笔试面试备考平台_牛客网
走出迷宫
题号:NC14572
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。
输入描述:
本题包含多组数据。 每组数据先输入两个数字N,M 接下来N行,每行M个字符,表示地图的状态。 数据范围: 2<=N,M<=500 保证有一个起点S,同时保证有一个终点E.
输出描述:
每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No
输入
3 3 S.. ..E ... 3 3 S## ### ##E
输出
Yes
解题思路:
遍历所有可能的点,从起点1出发,走它的所有的能走的邻居2,再逐一扩散,如果遇到终点,则标记一下,输出yes,反之输出no
#include<bits/stdc++.h>
using namespace std;
char room[504][504];
int dir[4][2] = {
{-1,0}, //向左
{0,-1}, //向上
{1,0}, //向右
{0,1} //向下
};
int n, m, f;
#define check(x, y) (x < n && y < m && x >= 0 && y >= 0) 检查是否越界
struct node //坐标
{
int x;
int y;
};
void BFS(int dx, int dy) {
f=0; // 标记
queue<node>q; //队列放坐标
node start, next;
start.x = dx;
start.y = dy;
q.push(start);
while (!q.empty()) {
start = q.front();
q.pop();
//cout<<start.x<<start.y<<endl;
for (int i = 0; i < 4; i++)
{
next.x = start.x + dir[i][0]; //上下左右逐一搜索
next.y = start.y + dir[i][1];
if (check(next.x, next.y) && room[next.x][next.y] != '#' ) {
//cout<<room[next.x][next.y]<<endl;
if(room[next.x][next.y]=='E'){
f=1; //已找到终点,标记一下
}
room[next.x][next.y] = '#'; //标记已走过
q.push(next);
}
}
}
}
int main() {
int x, y, dx, dy;
while (cin >> n >> m) {
if (n == 0 && m == 0) {
break;
}
for (x = 0; x < n; x++) {
for ( y = 0; y < m; y++){
cin >> room[x][y];
if (room[x][y] == 'S') {
dx = x;
dy = y;
}
}
}
f=0;
BFS(dx, dy);
if(f){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}