CodeForce 510 B

    xiaoxiao2025-10-12  15

    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 题解: 让每个字母都遍历一遍,dfs.

    <span style="font-family:SimSun;font-size:18px;">#include<cstdio> #include<cstring> int vis[55][55]; int n,m,mark; int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; char map[55][55]; int judge(int xx,int yy) { if(xx>0&&xx<=n&&yy>0&&yy<=m) return 1; return 0; } void dfs(int x,int y,int fx,int fy) { if(!judge(x,y)) return ; vis[x][y]=1; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(map[xx][yy]==map[x][y]&&judge(xx,yy)&&(xx!=fx||yy!=fy)/*防止走回头路*/) { if(vis[xx][yy]) { mark=1; return ; } dfs(xx,yy,x,y); } } return ; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(vis,0,sizeof(vis)); getchar(); int i,j; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) scanf("%c",&map[i][j]); getchar(); } int flag=1; mark=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(!vis[i][j]) { dfs(i,j,0,0); if(mark) // if(dfs(i,j,0,0)) 是错的(有返回值) { flag=0; printf("Yes\n"); break; } } } if(!flag) break; } if(flag) printf("No\n"); } return 0; }</span>

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