Codeforces Round #290 (Div. 2) B. Fox And Two Dots dfs

    xiaoxiao2025-01-18  11

    E - E Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit  Status  Practice  CodeForces 510B

    Description

    Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on a board of size n × m cells, like this:

    Each cell contains a dot that has some color. We will use different uppercase Latin characters to express different colors.

    The key of this game is to find a cycle that contain dots of same color. Consider 4 blue dots on the picture forming a circle as an example. Formally, we call a sequence of dots d1, d2, ..., dk a cycle if and only if it meets the following condition:

    These k dots are different: if i ≠ j then di is different from dj.k is at least 4.All dots belong to the same color.For all 1 ≤ i ≤ k - 1di and di + 1 are adjacent. Also, dk and d1 should also be adjacent. Cells x and y are called adjacent if they share an edge.

    Determine if there exists a cycle on the field.

    Input

    The first line contains two integers n and m (2 ≤ n, m ≤ 50): the number of rows and columns of the board.

    Then n lines follow, each line contains a string consisting of m characters, expressing colors of dots in each line. Each character is an uppercase Latin letter.

    Output

    Output "Yes" if there exists a cycle, and "No" otherwise.

    Sample Input

    Input 3 4 AAAA ABCA AAAA Output Yes Input 3 4 AAAA ABCA AADA Output No Input 4 4 YYYR BYBY BBBY BBBY Output Yes Input 7 6 AAAAAB ABBBAB ABAAAB ABABBB ABAAAB ABBBAB AAAAAB Output Yes Input 2 13 ABCDEFGHIJKLM NOPQRSTUVWXYZ Output No

    Hint

    In first sample test all 'A' form a cycle.

    In second sample there is no such cycle.

    The third sample is displayed on the picture above ('Y' = Yellow, 'B' = Blue, 'R' = Red).

    我用深度优先搜索做的,

    ac代码:

    #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 55; int px[4]= {1,-1,0,0}; int py[4]= {0,0,1,-1}; char map[N][N]; bool vis[N][N]; int temp,c1,c2,n,m; bool check(int x,int y) { int flag=0; for(int k=0; k<4; k++) { int u=x+px[k]; int v=y+py[k]; if(u>=0&&v>=0&&u<n&&v<m&&map[u][v]==map[c1][c2]&&vis[u][v]) flag++; } // printf("%d---\n",flag); if(flag>=2) return true; return false; } bool judge(int x,int y) { if(x>=0&&y>=0&&x<n&&y<m&&map[x][y]==map[c1][c2]&&!vis[x][y]) return true; return false; } void dfs(int i,int j,int cnt) { cnt++; vis[i][j]=true; if(check(i,j)&&cnt>=4) temp=1; for(int l=0; l<4; l++) { int nx=i+px[l]; int ny=j+py[l]; if(judge(nx,ny)) { vis[nx][ny]=true; dfs(nx,ny,cnt); } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { temp=0; for(int i=0; i<n; i++) { scanf("%s",map[i]); } memset(vis,false,sizeof(vis)); for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(!vis[i][j]) { c1=i,c2=j; dfs(i,j,0); } } } printf(temp==1?"Yes\n":"No\n"); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1295605.html
    最新回复(0)