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...