• 两点(DFS)


    福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个n×m单元上玩的。像这样:

     

    每一个单元有包含一个有色点。我们将用不同的大写字母来表示不同的颜色。

    这个游戏的关键是要找出一个包含同一颜色的环。看上图中4个蓝点,形成了一个环。一般的,我们将一个序列 d1,d2,...,dk 看成一个环,当且仅当它符合下列条件时:

    1.    这k个点不一样,即当 i≠j时, di 和 dj不同。

    2.    k至少是4。

    3.    所有的点是同一种颜色。

    4.    对于所有的 1≤i≤k-1: di 和 di+1 是相邻的。还有 dk 和 d1 也应该相邻。单元 x 和单元 y 是相邻的当且仅当他们有公共边。

    当给出一幅格点时,请确定里面是否有环。

    Input单组测试数据。 
    第一行包含两个整数n和m (2≤n,m≤50):板子的行和列。 
    接下来n行,每行包含一个有m个字母的串,表示当前行每一个点的颜色。每一个字母都是大写字母。Output如果有环输出Yes,否则输出No。Sample Input

    3 4
    AAAA
    ABCA
    AAAA
    3 4
    AAAA
    ABCA
    AADA

    Sample Output

    Yes
    No

    分析:使用dfs遍历二维数组,每个点只走一次,如果一个点即将走的下一个点的另外三个点是之前走过的点且颜色相同说明包含环

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 55;
    char mp[N][N];
    int dx[4] = {1, -1, 0, 0};
    int dy[4] = {0, 0, 1, -1};
    int vis[N][N];
    int n, m;
    int check(int x, int y) {
        return x >= 0 && x < n && y >= 0 && y < m; 
    }
    int dfs(int x, int y) {
        int flag = 0;
        vis[x][y] = 1;
        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if(check(nx, ny) && mp[nx][ny] == mp[x][y] && !vis[nx][ny]) {
                for(int j = 0; j < 4; j++) {
                    int mx = nx + dx[j], my = ny + dy[j];
                    if(mx == x && my == y) continue;
                    if(check(mx, my) && mp[mx][my] == mp[x][y] && vis[mx][my]) return 1;    
                }
                flag += dfs(nx, ny);    
            }
        }
        return flag;
    } 
    int main() {
        while(scanf("%d%d", &n, &m) == 2) {
            for(int i = 0; i < N; i++) 
                for(int j = 0; j < N; j++) vis[i][j] = 0; 
            for(int i = 0; i < n; i++) scanf("%s", mp[i]);    
            int flag = 0;
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    if(!vis[i][j] && dfs(i, j)) {
                        flag = 1;
                        break;    
                    }
                }
                if(flag) break;
            }
            if(flag) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
     
    作者:kindleheart
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    HTML5基础
    行为类型11-11:状态模式(State Pattern)
    行为类型11-10:中介者模式(MediatorPattern)
    行为类型11-9:责任链模式(Chain of Responsibility Pattern)
    行为类型11-8:模板模式(Template Pattern)
    行为类型11-7:命令模式(Command Pattern)
    行为类型11-6:解释器模式(Interpreter Pattern)
    FTP 连接失败,防火墙端口设置
    Windows下 NodeJs 版本管理 Nvm
    Ubuntu vi 方向键不正常问题
  • 原文地址:https://www.cnblogs.com/kindleheart/p/9296793.html
Copyright © 2020-2023  润新知