描述
月黑风高的夜晚,唐僧被蜘蛛精抓走了,被关到一个迷宫牢房里边。者行孙救人心切,直奔牢房。者行孙必须沿着一个方向(上、下、左、右)走两步(由于能力逆天,可以翻墙;但是不能停在墙所在的位置);唐僧柔弱,一次沿着一个方向((上、下、左、右))只能走一步。问在这个迷宫中,者行孙能否顺利救出师傅(者行孙跟唐僧相遇后,就能够背着唐僧逃出迷宫了哦,腻不腻害!)
输入
输入的第一行有两个整数
n(1≤n≤100),m(1≤m≤100),表示迷宫的行和列。
接下来有一个
n×m的地图,地图由’ 点 ’、’井号 ’、’ w ’、’ g ’这四个部分组成(省略号)‘点‘表示可以通行的路,‘ 井号 ’表示迷宫的墙,‘ w ’表示者行孙开始所在的位置,‘g’表示唐僧开始所在的位置。
输出
输出者行孙能否救出师傅,如果能,则输出”yes”,否则输出”no”。
输入样例 1
1 8
w....#/.//g
输出样例1
yes
输入样例 2
4 4
././/./g
#/#//#.(“/”和·“//”是分隔,为什么不让重复?!)
#//#/#.
w//#/.//#
输出样例2
no
75分代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
char maze[100][100];
int x1,y1_coord,x2,y2;
bool found=false;
bool isValid(int x,int y){
if(x>=0&&x<n&&y>=0&&y<m){
return true;
}
return false;
}
void dfs(int x,int y){
if(x==x2&&y==y2){
found=true;
return;
}
int dx[4]={-2, 2, 0, 0};
int dy[4]={0, 0, -1, 1};
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(isValid(nx,ny)&&maze[nx][ny]!='#'){
if(nx==x1&&ny==y1_coord){
nx+=dx[i];
ny+=dy[i];
}
if(isValid(nx,ny)&&maze[nx][ny]!='w'){
maze[nx][ny]='w';
dfs(nx,ny);
maze[nx][ny]='.';
}
}
}
}
int main() {
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>maze[i][j];
if (maze[i][j]=='w'){
x1=i;
y1_coord=j;
}else if(maze[i][j]=='g'){
x2=i;
y2=j;
}
}
}
dfs(x1, y1_coord);
if(found) cout<<"yes";
else cout<<"no";
return 0;
}