问题 E: 唐伯虎找秋香
题目描述
唐伯虎上次点秋香成功,嘚瑟的很,于是秋香为了让唐伯虎懂得珍惜,决定把自己藏起来。
如果天黑之前唐伯虎找不到她,那唐今晚就要睡沙发了!
已知秋香把自己藏在一个nm的迷宫里,唐伯虎的位置在(1,1),秋香的位置在(n,m)。
现在离天黑还有t分钟,唐伯虎每次移动1单位距离需要1分钟。
走过的地方有机关不能再走,并且只能上下左右移动。
请问他有机会找到秋香吗?
输入
样例输入由多组测试数据组成。每组样例第一行输入三个正整数,分别为迷宫的高度 n、宽度 m 和离天黑的时间 t,(1<n,m<7) (1<t<25)
接下来输入一个nm的迷宫,其中’A’表示唐伯虎,‘B’表示秋香,’*'表示墙壁,'0’表示可以走的道路
输出
对于每个样例,输出一行。
如果唐伯虎有可能找到秋香,输出YES
如果不能,输出NO
样例输入
4 5 11
A000
0000
000
000B
4 4 5
A00
000
000
0*0B
样例输出
YES
NO
提示
数据量可能很大,请使用scanf和printf输入输出
AC代码:
(bfs版)
#include<bits/stdc++.h>
using namespace std;
char s[10][10];
bool val[10][10];
int n,m,t;
int dir[4][2]={-1,0,0,-1,1,0,0,1};
struct node{
int x;
int y;
int step;
};
bool check(int a,int b){
if(a>=n||a<0||b>=m||b<0)
return false;
return true;
}
void bfs(){
node cur,nex;
cur.x=0;
cur.y=0;
cur.step=0;
val[cur.x][cur.y]=true;
queue<node>qu;
qu.push(cur);
while(!qu.empty()){
cur=qu.front();
qu.pop();
if(s[cur.x][cur.y]=='B'){
if(cur.step<=t)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return;
}
for(int i=0;i<4;i++){
nex.x=cur.x+dir[i][0];
nex.y=cur.y+dir[i][1];
nex.step=cur.step+1;
if(check(nex.x,nex.y)&&s[nex.x][nex.y]!='*'&&val[nex.x][nex.y]==false){
val[nex.x][nex.y]=true;
qu.push(nex);
}
}
}
cout<<"NO"<<endl;
return;
}
int main(){
while(cin>>n>>m>>t){
memset(val,false,sizeof(val));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>s[i][j];
}
}
bfs();
}
return 0;
}
dfs超时版代码:
#include<bits/stdc++.h>
using namespace std;
char s[10][10];
bool vis[10][10];
bool flag;
int n,m,t;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
bool check(int x,int y){
if(x<0||x>=n||y<0||y>=m){
return false;
}
return true;
}
void dfs(int x,int y,int ti){
if(ti>t) return;
if(flag) return;
if(s[x][y]=='B'){
if(ti<=t){
flag=true;
return;
}
}
for(int i=0;i<4;i++){
int fx=x+dir[i][0];
int fy=y+dir[i][1];
if(check(fx,fy)&&vis[fx][fy]==false&&s[fx][fy]!='*'){
vis[fx][fy]=true;
dfs(fx,fy,ti+1);
vis[fx][fy]=false;
}
}
}
int main(){
while(~scanf("%d%d%d",&n,&m,&t)){
flag=false;
int ax,ay;
memset(vis,false,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%s",&s[i]);
}
vis[0][0]==true;
dfs(0,0,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
掰掰
有缘再见