福克斯在玩一款手機解迷遊戲,這個遊戲叫做」兩點」。基礎級別的時候是在乙個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
單組測試資料。output第一行包含兩個整數n和m (2≤n,m≤50):板子的行和列。
接下來n行,每行包含乙個有m個字母的串,表示當前行每乙個點的顏色。每乙個字母都是大寫字母。
如果有環輸出yes,否則輸出no。input示例
3 4output示例aaaa
abca
aaaa
3 4aaaa
abca
aada
yesno1,dfs的思路就是暴力搜尋,不往回搜(這步很重要),如果搜尋的點標記過則有環,輸出yes,否則輸出no
**:
#include#include2.並查集思路:往下,往右走,如果字母相同,則令成同一祖先。如果有環,就成了矩形,矩形是關於對角線對稱的,往下的會使最後的頂點先變成祖先相等,之後往右則和最後頂點祖先相等,則標記,退出迴圈就好。#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;
}
**:
#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 上的應用和實現。從起點出發,走過的點要做標記,發現有沒走過的點,就隨意挑乙個往...