dfs(迷宫)

Posted lipu123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs(迷宫)相关的知识,希望对你有一定的参考价值。

问题 J: 棋盘行走


时间限制: 1 Sec  内存限制: 128 MB
[命题人:admin]

题目描述

小Biu在玩一个棋盘游戏,这个游戏给出一个n*m的棋盘,并且每个点上有一个棋子,棋子的颜色
用一个大写字母表示。
小Biu获得游戏胜利的条件是:
1.选择一个棋子作为起点。
2.每次只能走上下左右四个方格,并且下一步方格的颜色要与当前格颜色相同
3.每个块只能经过一次,要经过不少于4个不同的格子而且最终要走回起点。
问小Biu是否可以赢得游戏的胜利

输入

第一行包含两个整数n和m (2≤n,m≤50):棋盘的行和列。
接下来n行,每行包含一个有m个字母的串,表示当前行每一个点的颜色。每一个字母都是大写字母。

输出

如果小Biu可以获得胜利输出Yes,否则输出No。

样例输入 Copy

3 4
AAAA
ABCA
AAAA

样例输出 Copy

Yes

提示

1. 样例解释
样例中所有的‘A‘形成一个环。
2. 数据范围
对于20%的数据,n *m<=10;
对于65%的数据,n *m<=100;
对于100%的数据, n *m<=2500;
 
AC代码1:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!=-&&(c<0||c>9))c=getchar();if(c==-)f=-1,c=getchar();while(c>=0&&c<=9)x=x*10+c-0,c=getchar();return f*x;}
typedef long long ll;
char a[52][52];
int n,m;
int flag=0;
int vis[4][2] = {   
    { 0, 1 },
    { 1, 0 }, 
    { 0, -1 },
    { -1, 0 } };
int c[52][52]={0};
int d[52][52]={0};
void dfs(char ch,int x,int y,int t){
    if(flag){
        return ;
    }
    if(d[x][y]&&t>3){
            flag=1;
            return ;
    }
    for(int k=0;k<4;k++){
        int xx=x+vis[k][0];
        int yy=y+vis[k][1];
           if ( xx>=n || xx<0 || yy>=m || yy<0 || c[xx][yy] || ch!=a[xx][yy] ) 
            continue;
            c[xx][yy]=1;    
            dfs(ch,xx,yy,t+1);
            c[xx][yy]=0;
    }
}
int main()
{
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));
    cin>>n>>m;
    for(int k=0;k<n;k++){
        cin>>a[k];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            d[i][j]=1;
            dfs(a[i][j],i,j,0);
            if(flag==1){
                break; 
            }
            d[i][j]=0;
        }
        if(flag){
            break;
        }
    }
    if(flag){
        printf("Yes
");    
    }
    else{
        printf("No
");
    }
    return 0;
}

AC代码2:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!=-&&(c<0||c>9))c=getchar();if(c==-)f=-1,c=getchar();while(c>=0&&c<=9)x=x*10+c-0,c=getchar();return f*x;}
typedef long long ll;
char a[52][52];
int n,m;
int flag=0;
int vis[4][2] = {   
    { 0, 1 },
    { 1, 0 }, 
    { 0, -1 },
    { -1, 0 } };
int c[52][52]={0};
int d[52][52]={0};
void dfs(char ch,int x,int y,int t){
    if(flag){
        return ;
    }
    for(int k=0;k<4;k++){
        int xx=x+vis[k][0];
        int yy=y+vis[k][1];
        if(d[xx][yy]&&t>3){
            flag=1;
            return ;
        }
           if ( xx>=n || xx<0 || yy>=m || yy<0 || c[xx][yy] || ch!=a[xx][yy] ) 
            continue;
            c[xx][yy]=1;    
            dfs(ch,xx,yy,t+1);
            c[xx][yy]=0;
    }
}
int main()
{
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));
    cin>>n>>m;
    for(int k=0;k<n;k++){
        cin>>a[k];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            d[i][j]=1;
            c[i][j]=1;
            dfs(a[i][j],i,j,1);
            if(flag==1){
                break; 
            }
            d[i][j]=0;
            c[i][j]=1;
        }
        if(flag){
            break;
        }
    }
    if(flag){
        printf("Yes
");    
    }
    else{
        printf("No
");
    }
    return 0;
}

 

以上是关于dfs(迷宫)的主要内容,如果未能解决你的问题,请参考以下文章

通过迷宫问题简单学习DFS和BFS算法

通过迷宫问题简单学习DFS和BFS算法

P1363 幻象迷宫(dfs)

DFS(递归)模板 ——八皇后和迷宫寻找出路

递归+DFS--简单迷宫问题--百练2802

宽度优先搜索--------迷宫的最短路径问题(dfs)