??怂乖谕嬉豢钍謾C解迷游戲,這個游戲叫做”兩點”?;A級別的時候是在一個n×m單元上玩的。像這樣:
每一個單元有包含一個有色點。我們將用不同的大寫字母來表示不同的顏色。
這個游戲的關鍵是要找出一個包含同一顏色的環??瓷蠄D中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;}
新聞熱點
疑難解答