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

2021-08-20 00:07:04 字數 2213 閱讀 5800

上次我們講過回溯,是一種「通用解題法」,這裡我們要講的dfs是一種對圖或樹的搜尋,是對回溯思想的一種在樹\圖遍歷(the tree/graph it deals with is explicitly constructed )上的應用和實現。

從起點出發,走過的點要做標記,發現有沒走過的點,就隨意挑乙個往前走,走不了就回退,此種路徑搜尋策略就稱為「dfs

」,簡稱「深搜

」。對於回溯和dfs的理解:回溯是一種基本的思想,是在問題空間中迭代尋找解決方案。是一種「通用解題法」甚至不一定與樹\圖相關。 而dfs在是指圖演算法中的一種遍歷方法, 為了和bfs區分開。

1416 兩點

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 20 

難度:3級演算法題

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

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

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

,d2,...,d

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

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 4

aaaa

abca

aaaa

3 4aaaa

abca

aada

output示例

yes

no

vis對走過的點做標記,然後從起點開始,我們一步一步往前走,但是不允許走回頭路,在乙個空間區域裡不允許走回頭路的情況下如果最後又走回到了我們標記過的點,就說明成環了。

就像電影裡經常出現的情景,在乙個迷陣裡,拿個紅絲帶標記乙個樹,然後往乙個方向一直走,走著走著又回到了這個紅絲帶的樹?瞬間感覺自己被鬼給盯上了,怎麼也走不出迷陣。。。

#include #include #include #define nmax 205

#define inf 0x3f3f3f3f

#define ll long long

#define endl '\n'

using namespace std;

int n, m;

bool flag;

int step[4][2] = ,, , };

char mp[nmax][nmax];

bool vis[nmax][nmax];

void dfs (int x, int y, char c, int dir)

if (x<0 || x>n-1 || y<0 || y>m-1 || mp[x][y]!=c)

//在方框內 且同色

if (vis[x][y])

vis[x][y] = true;

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

}int main()

flag = 0;

memset(vis, false, sizeof(vis));

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

dfs(i, j, mp[i][j], -1);

if (flag){

cout<

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...