两点(51Nod-1416)
生活随笔
收集整理的這篇文章主要介紹了
两点(51Nod-1416)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
??怂乖谕嬉豢钍謾C解迷游戲,這個游戲叫做”兩點”?;A級別的時候是在一個n×m單元上玩的。像這樣:
每一個單元有包含一個有色點。我們將用不同的大寫字母來表示不同的顏色。
這個游戲的關鍵是要找出一個包含同一顏色的環??瓷蠄D中4個藍點,形成了一個環。一般的,我們將一個序列 d1,d2,...,dk 看成一個環,當且僅當它符合下列條件時:
1. ? ?這k個點不一樣,即當 i≠j時, di 和 dj不同。
2. ? ?k至少是4。
3. ? ?所有的點是同一種顏色。
4. ? ?對于所有的 1≤i≤k-1: di 和 di+1 是相鄰的。還有 dk 和 d1 也應該相鄰。單元 x 和單元 y 是相鄰的當且僅當他們有公共邊。
當給出一幅格點時,請確定里面是否有環。
輸入
單組測試數據。
第一行包含兩個整數n和m (2≤n,m≤50):板子的行和列。
接下來n行,每行包含一個有m個字母的串,表示當前行每一個點的顏色。每一個字母都是大寫字母。
輸出
如果有環輸出Yes,否則輸出No。
輸入樣例
3 4
AAAA
ABCA
AAAA
3 4
AAAA
ABCA
AADA
輸出樣例
Yes
No
思路:dfs 判環,注意搜索過程中的判斷條件,除了步數要大于等于 4 外,從一個點走到下一個點時,下一個點不能再走回上一個點
源程序
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 500+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std; int n,m; char G[N][N]; bool vis[N][N]; bool flag; void dfs(int x,int y,int prox,int proy,int step){if(flag)return;for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(vis[nx][ny]){if(nx!=prox||ny!=proy){if(step>=4){flag=true;return;}}}if(nx>=0 && nx<n && ny>=0 && ny<m && !vis[nx][ny] && G[nx][ny]==G[x][y] ){vis[nx][ny]=true;dfs(nx,ny,x,y,step+1);vis[nx][ny]=false;}} } int main() {while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++){getchar();for(int j=0;j<m;j++){char ch;scanf("%c",&ch);G[i][j]=ch;}}flag=false;memset(vis,false,sizeof(vis));for(int i=0;i<n;i++){if(flag)break;for(int j=0;j<m;j++){if(flag)break;if(!vis[i][j]){vis[i][j]=true;dfs(i,j,0,0,1);vis[i][j]=false;}}}if(flag)printf("Yes\n");elseprintf("No\n");}return 0; }?
總結
以上是生活随笔為你收集整理的两点(51Nod-1416)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 训练日志 2019.1.24
- 下一篇: 信息学奥赛一本通(1027:输出浮点数)