兩點(51nod 深搜)
阿新 • • 發佈:2018-11-08
福克斯在玩一款手機解迷遊戲,這個遊戲叫做”兩點”。基礎級別的時候是在一個n×m單元上玩的。像這樣:
每一個單元有包含一個有色點。我們將用不同的大寫字母來表示不同的顏色。
這個遊戲的關鍵是要找出一個包含同一顏色的環。看上圖中4個藍點,形成了一個環。一般的,我們將一個序列 d1,d2,…,dk 看成一個環,當且僅當它符合下列條件時:
-
這k個點不一樣,即當 i≠j時, di 和 dj不同。
-
k至少是4。
-
所有的點是同一種顏色。
-
對於所有的 1≤i≤k-1: di 和 di+1 是相鄰的。還有 dk 和 d1 也應該相鄰。單元 x 和單元 y 是相鄰的當且僅當他們有公共邊。
當給出一幅格點時,請確定裡面是否有環。
Input
單組測試資料。
第一行包含兩個整數n和m (2≤n,m≤50):板子的行和列。
接下來n行,每行包含一個有m個字母的串,表示當前行每一個點的顏色。每一個字母都是大寫字母。
Output
如果有環輸出Yes,否則輸出No。
Sample Input
3 4
AAAA
ABCA
AAAA
3 4
AAAA
ABCA
AADA
Sample Output
Yes
No
深搜題目,想明白就好了。在搜尋的過程中,不能往回搜尋,搜過的就標記為1,當搜尋的過程中遇見1就返回yes,否則就返回no。
程式碼如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int d[][2]={{1,0},{0,1},{-1,0},{0,-1}}; char a[51][51]; int n,m; int flag=0; int vis[51][51]; void dfs(int x,int y,int xx,int yy) { for(int i=0;i<4;i++) { if(xx==-d[i][0]&&yy==-d[i][1]) continue; int tx=x+d[i][0]; int ty=y+d[i][1]; if(tx<0||tx==n||ty<0||ty==m||a[tx][ty]!=a[x][y]) continue; if(vis[tx][ty]) { flag=1; return ; } vis[tx][ty]=1; dfs(tx,ty,d[i][0],d[i][1]); if(flag) return ; } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { flag=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) scanf("%s",a[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(!vis[i][j]) { dfs(i,j,0,0); if(flag) break; } } if(flag) break; } if(flag) printf("Yes\n"); else printf("No\n"); } }
努力加油a啊,(o)/~