Description
现在一只老鼠被困在了迷宫里!你需要判断老鼠能否走出迷宫。
老鼠只能向上下左右四个方向移动。我们认为只要老鼠走到了迷宫的边界即算走出迷宫。
Input
第一行输入两个整数 nn, mm (1 \leqslant n, m \leqslant 100)(1⩽n,m⩽100) 表示迷宫地图的尺寸。
接下来输入 nn 行,每行 mm 个字符,表示迷宫地图。其中 M
表示老鼠的位置,*
代表墙壁,.
代表空地。
Output
如果老鼠可以走出迷宫,则输出一行 Yes
,否则输出一行 No
。
Sample
Input
4 4 *.** *..* *.M* ****
Output
Yes
Hint
用了两种方法,DFS和BFS,有兴趣的可以都看看。
BFS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXVEX 111
typedef struct q
{
int x;
int y;
}Que;
Que queue[10000];
char map[MAXVEX][MAXVEX];
int vis[MAXVEX][MAXVEX];
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
int n,m,flag;
void BFS(int x,int y)
{
int rear,front,kx,ky;
Que now;
Que top;
Que t;
rear = front = 0;
vis[x][y] = 1;
now.x = x;
now.y = y;
queue[rear++]=now;
while(rear>front){
top = queue[front++];
if(top.x==0 || top.x==n-1 || top.y==0 || top.y==m-1){
flag = 1;
return;
}
for(int i=0;i<4;i++){
kx = top.x + dx[i];
ky = top.y + dy[i];
if(!vis[kx][ky]&&map[kx][ky]!='*'&&kx>=0&&kx<n&&ky>=0&&ky<m){
vis[kx][ky] = 1;
t.x = kx;
t.y = ky;
queue[rear++] = t;
}
}
}
}
int main()
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",map[i]);
for(int j=0;j<m;j++){
if(map[i][j]=='M'){
x = i;
y = j;
}
}
}
BFS(x,y);
if(flag){
printf("Yes");
}
else{
printf("No\n");
}
return 0;
}
DFS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXVEX 101
char map[MAXVEX][MAXVEX];
int vis[MAXVEX][MAXVEX];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int n,m,flag;
void DFS(int x,int y)
{
if(x==0 || x==n-1 || y==0 || y==m-1){
flag = 1;
return;
}
vis[x][y] = 1;
for(int k=0;k<4;k++){
int i,j;
i = x + dx[k];
j = y + dy[k];
if(!vis[i][j]&&map[i][j]!='*'&&i>=0&&i<n&&j>=0&&j<m){
DFS(i,j);
}
}
}
int main()
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",map[i]);
for(int j=0;j<m;j++){
if(map[i][j]=='M'){
x = i;
y = j;
}
}
}
DFS(x,y);
if(flag){
printf("Yes");
}
else{
printf("No");
}
return 0;
}