唐伯虎找秋香
唐伯虎上次点秋香成功,嘚瑟的很,于是秋香为了让唐伯虎懂得珍惜,决定把自己藏起来。如果天黑之前唐伯虎找不到她,那唐今晚就要睡沙发了!
已知秋香把自己藏在一个nm的迷宫里,唐伯虎的位置在(1,1),秋香的位置在(n,m)。现在离天黑还有t分钟,唐伯虎每次移动1单位距离需要1分钟。走过的地方有机关不能再走,并且只能上下左右移动。
请问他有机会找到秋香吗?
输入
样例输入由多组测试数据组成。每组样例第一行输入三个正整数,分别为迷宫的高度 n、宽度 m 和离天黑的时间 t,(1
输出
对于每个样例,输出一行。
如果唐伯虎有可能找到秋香,输出YES
如果不能,输出NO
样例输入
4 5 11
A000
0000
000
000B
4 4 5
A00
000
000
0*0B
样例输出
YES
NO*
*总结:这类题是迷宫类的题,这题用DFS运行的时间会比较慢,但用BFS会更快一些,DFS还需要剪枝,比较麻烦,而且BFS算法代码也比较短。
代码1 (BFS的解法)
#include
using namespace std;
#define maxn 8
char s[maxn][maxn];
bool vis[maxn][maxn];
int n,m,a,b,flag,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},k;
struct node{
int x,y,step;
};
queue<node> q;
bool judge(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0&&s[x][y]=='0') return true;
return false;
}
void BFS(int xx,int yy,int z){
node t;
t.x=1;
t.y=1;
t.step=0;
q.push(t);
while(!q.empty()){
node tt;
tt=q.front();
q.pop();
if(tt.x==xx&&tt.y==yy&&tt.step<=z){
flag=1;
}
for(int i=0;i<4;i++){
int fx=tt.x+dir[i][0];
int fy=tt.y+dir[i][1];
if(judge(fx,fy)){
node ft;
ft.x=fx;
ft.y=fy;
ft.step=tt.step+1;
q.push(ft);
vis[fx][fy]=1;
}
}
}
}
int main()
{
while(cin>>n>>m>>k){
flag=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
if(s[i][j]=='B'){
s[i][j]='0';
a=i;
b=j;
}
}
}
vis[1][1]=1;
BFS(a,b,k);
if(flag==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
代码2 (DFS的解法)
#include
#define maxn 10
using namespace std;
char s[maxn][maxn];
int vis[maxn][maxn];
int n,m,h,a1,b1,a2,b2,flag;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool judge(int f,int g){
if(f>=0&&f<n&&g>=0&&g<m&&s[f][g]!='*'&&vis[f][g]==0){
return true;
}
return false;
}
void DFS(int x,int y,int z){
if(z>h) return;
if(n+m-x-y-3>=h-z) return;
if(s[x][y]=='B'){
flag=1;
return;
}
for(int i=0;i<4;i++){
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(judge(xx,yy)==true){
vis[xx][yy]=1;
dfs(xx,yy,z+1);
vis[xx][yy]=0;
if(flag==1) return;
}
}
return;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m>>h){
int k=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>s[i][j];
}
}
flag=0;
memset(vis,0,sizeof(vis));
vis[0][0]=1;
DFS(0,0,0);
if(flag==0) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}