国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

51Nod - 1416 搜索環

2019-11-10 20:06:50
字體:
來源:轉載
供稿:網友

題意:

福克斯在玩一款手機解迷游戲,這個游戲叫做”兩點”。基礎級別的時候是在一個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 4AAAAABCAAAAA3 4AAAAABCAAADAOutput示例
YesNo

思路:

簡單的搜索環,將相同顏色且互相可以到達的點都連上邊然后判斷是否存在環就行了,按照這樣的建圖方式,如果有環一定不小于4,所以不需要判斷環的大小。

代碼:

#include <bits/stdc++.h>using namespace std;const int MAXN = 55;char str[MAXN][MAXN];vector <int> G[MAXN * MAXN];bool vis[MAXN * MAXN];bool dfs(int u, int PRe) {    vis[u] = true;    int cnt = G[u].size();    for (int i = 0; i < cnt; i++) {        int v = G[u][i];        if (v == pre) continue;        if (vis[v] || dfs(v, u)) return true;    }    return false;}const int dx[] = {-1, 1, 0, 0};const int dy[] = {0, 0, -1, 1};int main() {    int n, m;    scanf("%d%d", &n, &m);    for (int i = 0; i < n; i++) {        scanf("%s", str[i]);    }    for (int x = 0; x < n; x++) {        for (int y = 0; y < m; y++) {            int u = x * m + y;            for (int k = 0; k < 4; k++) {                int nx = x + dx[k], ny = y + dy[k];                if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;                if (str[nx][ny] != str[x][y]) continue;                int v = nx * m + ny;                G[u].push_back(v);            }        }    }    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            int u = i * m + j;            if (vis[u]) continue;            if (dfs(u, -1)) {                puts("Yes");                return 0;            }        }    }    puts("No");    return 0;}
上一篇:P1996 約瑟夫問題

下一篇:宿舍管理系統

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 甘谷县| 白朗县| 化隆| 巴青县| 汽车| 九龙县| 武义县| 乐昌市| 长宁区| 阳城县| 华安县| 江川县| 托里县| 比如县| 蒙城县| 阿鲁科尔沁旗| 神农架林区| 门头沟区| 扎兰屯市| 和田市| 全州县| 阜宁县| 凌海市| 石阡县| 和龙市| 海兴县| 虎林市| 东兰县| 安乡县| 新郑市| 镇巴县| 巨野县| 屯留县| 横山县| 浠水县| 巴林左旗| 定西市| 临猗县| 义乌市| 广昌县| 凌云县|