zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    bzoj1051(明星奶牛)
    hdu4081(秦始皇的道路系统)
    bzoj2330(差分约束)
    JPA & Hibernate 注解
    Hibernate中对象的3种状态:瞬时态、持久态、脱管态
    Spring Data JAP 多个不是必填的查询条件处理
    设计模式
    Java远程方法调用(RMI)
    Javascript注意事项四【提高循环性能的策略】
    Javascript注意事项三【使用假值】
  • 原文地址:https://www.cnblogs.com/lipu123/p/12182059.html
Copyright © 2011-2022 走看看