zoukankan      html  css  js  c++  java
  • 51nod 1416 两点 dfs

    题目来源: CodeForces
    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
     收藏
     关注

    福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个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。
    Input示例
    3 4
    AAAA
    ABCA
    AAAA
    3 4
    AAAA
    ABCA
    AADA
    Output示例
    Yes
    No


    dfs直接搜,走过的点标记
    不回头走 如果搜到已经标记过的点的话证明成环
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <iomanip>
    #include <math.h>
    #include <map>
    using namespace std;
    #define FIN     freopen("input.txt","r",stdin);
    #define FOUT    freopen("output.txt","w",stdout);
    #define INF     0x3f3f3f3f
    #define INFLL   0x3f3f3f3f3f3f3f
    #define lson    l,m,rt<<1
    #define rson    m+1,r,rt<<1|1
    typedef long long LL;
    typedef pair<int, int> PII;
    using namespace std;
    
    char mp[55][55];
    int vis[55][55];
    int flag  = 0;
    int fs[] = {0, -1, 0, 1};  //下左上右
    int fs2[] = {1, 0, -1, 0};
    int n, m;
    
    void dfs(int x, int y, char c, int dir) {
         if(x < 0 || x > n-1 || y < 0 || y > m-1 || mp[x][y] != c) return;
         if(vis[x][y]) {
            flag = 1;
            //cout << x<<"  "<< y << " "<<dir <<endl;
         }
         if(flag) return;
         vis[x][y] = 1;
         for(int i = 0; i < 4; i++) {
            if(dir == 0 && i == 2) continue;
            if(dir == 1 && i == 3) continue;
            if(dir == 2 && i == 0) continue;
            if(dir == 3 && i == 1) continue;
            int xx = x + fs[i];
            int yy = y + fs2[i];
            dfs(xx, yy, c, i);
         }
    }
    
    int main() {
        //FIN
        while(~scanf("%d%d", &n, &m)) {
            for(int i = 0; i < n; i++) scanf("%s", mp[i]);
            flag = 0;
            memset(vis, 0, sizeof(vis));
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    if(flag) break;
                    if(vis[i][j]) continue;
                    dfs(i, j, mp[i][j], -1);
                }
                if(flag) break;
            }
            if(flag) printf("YES
    ");
            else printf("NO
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    前端与后端的一些论述
    Pandas Cheat Sheet
    flask+socketio+echarts3 服务器监控程序(基于后端数据推送)
    【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
    【Java并发编程实战】-----“J.U.C”:锁,lock
    【Java并发编程实战】-----synchronized
    【java并发编程实战】-----线程基本概念
    2015年读书系统
    阮一峰文集:《一个寻找作者的读者》
    进一步封装highchart,打造自己的图表插件:jHighChart.js
  • 原文地址:https://www.cnblogs.com/Hyouka/p/7332145.html
Copyright © 2011-2022 走看看