【CodeForces 510B】Fox And Two Dots

    xiaoxiao2024-12-23  16

    Fox And Two Dots

    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 - 1: di 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代码

    最后还是用dfs写了,思路有点小问题。

    // SHENMEDOUSHEQIBULIAODERENSHENMEDOUGAIBIANBULIAO // 用DFS 的关键,不是返回原点,而是连成环 。 // 这样只要经过 不是上一个的 已标记过的点,就可以证明是 Yes. #include<cstdio> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; char map[51][51]; int vis[51][51]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int n,m,flag; void dfs( int x,int y,int lax,int lay ) { int nx,ny; char c = map[x][y]; for( int k=0; k<4; k++ ) { nx = x+dx[k]; ny = y+dy[k]; if( nx>=0 && ny>=0 && nx<n && ny<m && map[nx][ny] == c ) { if( nx == lax && ny == lay)continue; if( vis[nx][ny]){ flag = 1; return; } vis[nx][ny] = 1; dfs(nx,ny,x,y); } } } int main() { int cnt; while( ~scanf("%d%d",&n,&m) ) { flag = 0; memset(vis,0,sizeof(vis)); for( int i=0; i<n; i++ ){ scanf("%s",map[i]); } for( int i=0; i<n; i++ ) { for( int j=0; j<m; j++ ) { if( vis[i][j] == 0 ){ dfs(i,j,-1,-1); } if( flag == 1 ){ break; } } } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }

    —————————————————————————————————————————— 错误代码:没注意到回溯的性质。

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char map[51][51]; int vis[51][51]; int bs[51][51]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int n,m; int cnt; int stx,sty; char ch; int num; int flag2; void dfs( int x,int y ) { int nx,ny; vis[x][y] = 1; if( x == stx && y == sty &&flag2 == 0) vis[x][y] = 0; flag2 = 1; for( int i=0; i<4; i++ ) { nx = x+dx[i]; ny = y+dy[i]; if( nx == stx && ny == sty && num >3 && vis[nx][ny] == 0){ printf("%d\n",num); cnt = 1; } if( nx>=0&&ny>=0&&nx<n&&ny<m&&map[nx][ny]== ch&&vis[nx][ny]==0 &&cnt == 0) { num++; printf("%d %d\n",nx,ny); dfs(nx,ny); } } } int main() { int flag; while( ~scanf("%d%d",&n,&m) ) { cnt = 0; memset(vis,0,sizeof(vis)); memset(bs,0,sizeof(bs)); for( int i=0; i<n; i++ ) { scanf("%s",map[i]); } flag = 0; for( int i=0; i<n; i++ ) { for( int j=0; j<m; j++ ) { if( bs[i][j] == 0 ) { stx = i; sty = j; ch = map[i][j]; num = 0; flag2 = 0; dfs(i,j); if( cnt == 1 ){ flag = 1; break; } memset(vis,0,sizeof(vis)); bs[i][j] = 1; } // printf("%c",map[i][j]); } } if( flag == 1 )printf("Yes\n"); else printf("No\n"); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1294910.html
    最新回复(0)