51nod C 棋盤行走 DFS

2021-09-29 02:45:45 字數 2045 閱讀 3068

1.0 秒 131,072.0 kb 100 分

小biu在玩乙個棋盤遊戲,這個遊戲給出乙個n*m的棋盤,並且每個點上有乙個棋子,棋子的顏色用乙個大寫字母表示。

小biu獲得遊戲勝利的條件是:

1.選擇乙個棋子作為起點。

2.每次只能走上下左右四個方格,並且下一步方格的顏色要與當前格顏色相同

3.每個塊只能經過一次,要經過不少於4個不同的格仔而且最終要走回起點。

問小biu是否可以贏得遊戲的勝利

輸入

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

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

輸出

如果小biu可以獲得勝利輸出yes,否則輸出no。

資料範圍

對於20%的資料,n *m<=10;

對於65%的資料,n *m<=100;

對於100%的資料, n *m<=2500;

輸入樣例

3 4aaaa

abca

aaaa

輸出樣例

yes樣例解釋

樣例中所有的』a』形成乙個環。

思路:

dfs,從起點搜尋到起點時,即為遞迴出口,此時遞迴返回 ture ,兩種控制搜尋方向的方式,用的時候記得注釋一種。

**:

#include

using

namespace std;

const

int maxn =55;

int n, m;

char a[maxn]

[maxn]

;bool vis[maxn]

[maxn]

;bool isstratpos[maxn]

[maxn]

;bool ans =

false

;//第一種方式:用陣列來控制方向

int nxt[4]

[2]=

,,,}

;void dfs (

char ch,

int x,

int y,

int len )

if( tx>=n || tx<

0|| ty>=m || ty<

0|| vis[tx]

[ty]

|| ch!=a[tx]

[ty]

)continue

; vis[tx]

[ty]

=true

; dfs ( ch, tx, ty, len+1)

; vis[tx]

[ty]

=false;}

}//第二種方式:用for迴圈控制方向

void dfs (

char ch,

int x,

int y,

int len )

if( tx>=n || tx<

0|| ty>=m || ty<

0|| vis[tx]

[ty]

|| ch!=a[tx]

[ty]

)continue

; vis[tx]

[ty]

=true

; dfs ( ch, tx, ty, len+1)

; vis[tx]

[ty]

=false;}

}}int main ()if

( ans )

break;}

cout <<

( ans ?

"yes"

:"no"

)<< endl;

return0;

}

DFS 棋盤行走

題目描述 解題思路 可以看出n m n mn m是真的小哇!所以直接爆搜就可以了 如果想保險一點,可以嘗試前3步爆搜,後面寬搜 code include include include include using namespace std const int way 4 2 int n,m,a 2...

51nod 棋盤行走 深度優先搜尋

原樣題目連線 給乙個 n m 的棋盤,棋盤每個格仔顏色都是乙個大寫字母,以乙個格仔為起點,每次只能走上下左右四個方向,並且每個格仔只能走一次,要求 至少經過四個顏色相同的不同格仔最終走回起點 若可以輸出 yes,否則 no.直接 dfs,一直忘記回溯起點,wa到蹦 唉 後來考慮了下,的確完全沒必要用...

51nod 1327 棋盤遊戲

有乙個n行m列的棋盤,即該棋盤被分為n m格。現在向棋盤中放棋子,每個格仔中最多放乙個棋子,也可以乙個不放。放完棋子後需要滿足如下要求 1 對於第i行來說,其從左往右的前left i 個格仔 即最左側的left i 個連續的格仔 中恰好一共有1個棋子 2 對於第i行來說,其從右往左的前right i...