51nod1416兩點(dfs或並查集)

2022-08-15 05:54:15 字數 2005 閱讀 3156

福克斯在玩一款手機解迷遊戲,這個遊戲叫做」兩點」。基礎級別的時候是在乙個n×m單元上玩的。像這樣:

每乙個單元有包含乙個有色點。我們將用不同的大寫字母來表示不同的顏色。

這個遊戲的關鍵是要找出乙個包含同一顏色的環。看上圖中4個藍點,形成了乙個環。一般的,我們將乙個序列 d

1,d2,...,d

k 看成乙個環,當且僅當它符合下列條件時:

1.    這k個點不一樣,即當 i≠j時, d

i 和 d

j不同。

2.    k至少是4。

3.    所有的點是同一種顏色。

4.    對於所有的 1≤i≤k-1: d

i 和 d

i+1 是相鄰的。還有 d

k 和 d

1 也應該相鄰。單元 x 和單元 y 是相鄰的當且僅當他們有公共邊。

當給出一幅格點時,請確定裡面是否有環。

input

單組測試資料。

第一行包含兩個整數n和m (2≤n,m≤50):板子的行和列。

接下來n行,每行包含乙個有m個字母的串,表示當前行每乙個點的顏色。每乙個字母都是大寫字母。

output

如果有環輸出yes,否則輸出no。
input示例

3 4

aaaa

abca

aaaa

3 4aaaa

abca

aada

output示例

yes

no1,dfs的思路就是暴力搜尋,不往回搜(這步很重要),如果搜尋的點標記過則有環,輸出yes,否則輸出no

**:

#include#include

#include

#include

using

namespace

std;

char s[55][55

];int visit[55][55

];int dir[4][2]=;

intn,m,flag;

void dfs(int x,int y,int sum,char ch)//

x,y為座標,ch是要搜尋的字元,sum是搜尋方向,0是上,1是下,2是左,3是右

if(flag)

return

; visit[x][y]=1

;

for(int i=0;i<4;i++)

}int

main()

if(flag==1

) cout

<

yes"

<

else

cout

<

<

}return0;

}

2.並查集思路:往下,往右走,如果字母相同,則令成同一祖先。如果有環,就成了矩形,矩形是關於對角線對稱的,往下的會使最後的頂點先變成祖先相等,之後往右則和最後頂點祖先相等,則標記,退出迴圈就好。

**:

#include#include

#include

#include

using

namespace

std;

int fa[3000

];char s[60][60

];int find(int x)//

查詢祖先

bool unionn(int x,int y)//

連通祖先

intmain()

if(flag)

break

; }

if(flag)

cout

<

yes"

<

else

cout

<

<

} return0;

}

51nod1416 搜尋 剪枝 並查集 兩點

中文題意。開始t了一發。後來發現了剪枝。那就是如果再dfs的過程中發現了以前搜尋的點,並且這個點不是當前搜尋點的父親節點,那麼必然已經成環,並且大小至少為4 並查集沒怎麼看懂。補 include include include include const int maxn 51 int m,n in...

兩點(51nod 深搜)

福克斯在玩一款手機解迷遊戲,這個遊戲叫做 兩點 基礎級別的時候是在乙個n m單元上玩的。像這樣 每乙個單元有包含乙個有色點。我們將用不同的大寫字母來表示不同的顏色。這個遊戲的關鍵是要找出乙個包含同一顏色的環。看上圖中4個藍點,形成了乙個環。一般的,我們將乙個序列 d1,d2,dk 看成乙個環,當且僅...

DFS深度優先搜尋 之 兩點」遊戲

上次我們講過回溯,是一種 通用解題法 這裡我們要講的dfs是一種對圖或樹的搜尋,是對回溯思想的一種在樹 圖遍歷 the tree graph it deals with is explicitly constructed 上的應用和實現。從起點出發,走過的點要做標記,發現有沒走過的點,就隨意挑乙個往...