SDUTOJ3469_深度优先搜索练习之神奇的矩环(DFS)
深度優(yōu)先搜索練習(xí)之神奇的矩環(huán)
Time Limit:?1000 ms?Memory Limit:?65536 KiB
Submit?Statistic
Problem Description
小鑫的女朋友被魔王搶走了!
魔王留給小鑫一張n*m大的表,上面有各種各樣的顏色,用A-Z這26個(gè)字母來表示。魔王留給他一個(gè)任務(wù),如果小鑫可以在這張表中找出任意一個(gè)長(zhǎng)度大于1的環(huán),并且這個(gè)環(huán)的顏色是相同的,魔王就把小鑫的女朋友還給他。為了從魔王手中奪回他的女朋友,小鑫請(qǐng)你幫忙,你能幫幫他嗎?
Input
多組輸入。
每組的第一行有兩個(gè)整數(shù)n,m。代表表的大小。
接下來是由A-Z的一些字母所構(gòu)成的n行m列的表。
1<=n,m<=200
Output
如果可以救回他的女朋友,輸出Yes,否則輸出No
Sample Input
4 7 ABCBBAA BCBCBCB AABBCCA ACCCBBB 10 3 AAC ABB BBA AAC CBC CCA CBB CCA CCB BAASample Output
No YesHint
?
Source
這個(gè)題參考學(xué)長(zhǎng)思路? 寫下存檔:https://blog.csdn.net/m0_37624640/article/details/77102310
dfs這種算法的理解:學(xué)長(zhǎng)畫了兩張圖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? 其實(shí)這個(gè)算法就是從源點(diǎn)出發(fā),搜索它的四個(gè)方向即上,下,左,右。若能找到與其顏色相同的點(diǎn),那么他們之間就連通。然后在DFS,直到找到第四個(gè)頂點(diǎn)時(shí),若能形成環(huán),那么第四個(gè)頂點(diǎn)一定和源點(diǎn)之間有“邊”,這時(shí)候另標(biāo)記變量flag=1,返回。我算了一下,有八種形成環(huán)的走法,每個(gè)環(huán)有四個(gè)點(diǎn),那么這四個(gè)點(diǎn)都可以當(dāng)做源點(diǎn),即最終和第四個(gè)頂點(diǎn)連通的一定是源點(diǎn)。那么就是4種走法。順時(shí)針4種,逆時(shí)針4種,即8種。
----------------------------------------------------------------------------------------------------------------
/*模仿別人代碼*/ #include <bits/stdc++.h> using namespace std; char gra[222][222]; int cat[222][222]; int n, m, flag; void dfs(int x, int y, int i, int j) {cat[x][y] = 1;if (flag)return;if (x - 1 >= 0 && gra[x - 1][y] == gra[x][y]){if (cat[x - 1][y] && ((x - 1 != i) || (y != j)))flag = 1;else if (!cat[x - 1][y])dfs(x - 1, y, x, y);}if (x + 1 < n && gra[x + 1][y] == gra[x][y]){if (cat[x + 1][y] && ((x + 1 != i) || (y != j)))flag = 1;else if (!cat[x + 1][y])dfs(x + 1, y, x, y);}if (y - 1 >= 0 && gra[x][y - 1] == gra[x][y]){if (cat[x][y - 1] && ((x != i) || (y - 1 != j)))flag = 1;else if (!cat[x][y - 1])dfs(x, y - 1, x, y);}if (y + 1 < m && gra[x][y + 1] == gra[x][y]){if (cat[x][y + 1] && ((x != i) || (y + 1 != j)))flag = 1;else if (!cat[x][y + 1])dfs(x, y + 1, x, y);} } int main() {ios::sync_with_stdio(false);while (cin >> n >> m){memset(cat, 0, sizeof(cat));flag = 0;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++)cin >> gra[i][j];}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (!cat[i][j])dfs(i, j, i, j);if (flag)break;}if (flag)break;}if (flag)cout << "Yes" << endl;elsecout << "No" << endl;}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/iQXQZX/p/10258735.html
總結(jié)
以上是生活随笔為你收集整理的SDUTOJ3469_深度优先搜索练习之神奇的矩环(DFS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [人工智能-综述-6]:为什么说,系统的
- 下一篇: Veebot-自动静脉抽血机器人