DFS BFS

唐伯虎找秋香
唐伯虎上次点秋香成功,嘚瑟的很,于是秋香为了让唐伯虎懂得珍惜,决定把自己藏起来。如果天黑之前唐伯虎找不到她,那唐今晚就要睡沙发了!
已知秋香把自己藏在一个nm的迷宫里,唐伯虎的位置在(1,1),秋香的位置在(n,m)。现在离天黑还有t分钟,唐伯虎每次移动1单位距离需要1分钟。走过的地方有机关不能再走,并且只能上下左右移动。
请问他有机会找到秋香吗?
输入
样例输入由多组测试数据组成。每组样例第一行输入三个正整数,分别为迷宫的高度 n、宽度 m 和离天黑的时间 t,(1 接下来输入一个n
m的迷宫,其中’A’表示唐伯虎,‘B’表示秋香,’'表示墙壁,'0’表示可以走的道路
输出
对于每个样例,输出一行。
如果唐伯虎有可能找到秋香,输出YES
如果不能,输出NO
样例输入
4 5 11
A
000
0000
00
0

000B
4 4 5
A0
0
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;
}

你可能感兴趣的:(编程,深度优先,宽度优先,图论)