两点(51Nod-1416)
題目
福克斯在玩一款手機(jī)解迷游戲,這個(gè)游戲叫做”兩點(diǎn)”。基礎(chǔ)級(jí)別的時(shí)候是在一個(gè)n×m單元上玩的。像這樣:
每一個(gè)單元有包含一個(gè)有色點(diǎn)。我們將用不同的大寫字母來(lái)表示不同的顏色。
這個(gè)游戲的關(guān)鍵是要找出一個(gè)包含同一顏色的環(huán)。看上圖中4個(gè)藍(lán)點(diǎn),形成了一個(gè)環(huán)。一般的,我們將一個(gè)序列 d1,d2,...,dk 看成一個(gè)環(huán),當(dāng)且僅當(dāng)它符合下列條件時(shí):
1. ? ?這k個(gè)點(diǎn)不一樣,即當(dāng) i≠j時(shí), di 和 dj不同。
2. ? ?k至少是4。
3. ? ?所有的點(diǎn)是同一種顏色。
4. ? ?對(duì)于所有的 1≤i≤k-1: di 和 di+1 是相鄰的。還有 dk 和 d1 也應(yīng)該相鄰。單元 x 和單元 y 是相鄰的當(dāng)且僅當(dāng)他們有公共邊。
當(dāng)給出一幅格點(diǎn)時(shí),請(qǐng)確定里面是否有環(huán)。
輸入
單組測(cè)試數(shù)據(jù)。
第一行包含兩個(gè)整數(shù)n和m (2≤n,m≤50):板子的行和列。
接下來(lái)n行,每行包含一個(gè)有m個(gè)字母的串,表示當(dāng)前行每一個(gè)點(diǎn)的顏色。每一個(gè)字母都是大寫字母。
輸出
如果有環(huán)輸出Yes,否則輸出No。
輸入樣例
3 4
AAAA
ABCA
AAAA
3 4
AAAA
ABCA
AADA
輸出樣例
Yes
No
思路:dfs 判環(huán),注意搜索過(guò)程中的判斷條件,除了步數(shù)要大于等于 4 外,從一個(gè)點(diǎn)走到下一個(gè)點(diǎn)時(shí),下一個(gè)點(diǎn)不能再走回上一個(gè)點(diǎn)
源程序
#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; }?
總結(jié)
以上是生活随笔為你收集整理的两点(51Nod-1416)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 训练日志 2019.1.24
- 下一篇: 信息学奥赛一本通(1027:输出浮点数)