CodeForces - 510B Fox And Two Dots(DFS)
2017-03-11 11:18
239 查看
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.
Examples
input
output
input
output
input
output
input
output
input
output
Note
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).
ps:直接dfs,只要走到已经走过的点就说明已经成环
注意:有可能出现从这个点走出去一步又回到这个点的情况,所以需要标记一下当前点的下一步坐标不能和当前点的上一步坐标相同
代码:
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.
Examples
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
Note
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).
ps:直接dfs,只要走到已经走过的点就说明已经成环
注意:有可能出现从这个点走出去一步又回到这个点的情况,所以需要标记一下当前点的下一步坐标不能和当前点的上一步坐标相同
代码:
#include<stdio.h> #include<string.h> char s[55][55]; int vis[55][55]; int n,m,flag; int to[][2]= {0,1,0,-1,1,0,-1,0}; char k; void dfs(int x,int y,int pre_x,int pre_y)//pre_x为当前点的上一步点的x轴,pre_y为当前点的上一步点的y轴 { if(flag) return ; for(int i=0; i<4; i++) { int xx=x+to[i][0],yy=y+to[i][1]; if(s[xx][yy]==k&&xx>=0&&xx<n&&yy>=0&&yy<m) { if(xx==pre_x&&yy==pre_y) continue; else if(vis[xx][yy]) { flag=1; return ; } else if(!vis[xx][yy]) { vis[xx][yy]=1; dfs(xx,yy,x,y); } } } } int main() { flag=0; scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%s",s[i]); for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { memset(vis,0,sizeof(vis)); k=s[i][j],vis[i][j]=1; for(int t=0; t<4; t++) { int xx=i+to[t][0],yy=j+to[t][1]; if(s[xx][yy]==k&&xx>=0&&xx<n&&yy>=0&&yy<m) dfs(xx,yy,i,j); } if(flag) break; } if(flag) break; } if(flag) printf("Yes\n"); else printf("No\n"); return 0; }
相关文章推荐
- codeforces-#476B. Dreamoon and WiFi(dfs、二进制枚举)
- codeforces 767C (dfs)
- codeforces 767 c Garland(dfs)
- Codeforces 638C Road Improvement【思维+Dfs】
- CodeForces 149D 括号染色问题 dp+dfs好题
- codeforces 510B (dfs 水)
- Codeforces 343D Water Tree(DFS序 + 线段树)
- Codeforces 366D - Dima and Trap Graph(DFS)
- CodeForces - 510B Fox And Two Dots(DFS)
- CodeForces 510B Fox And Two Dots(深搜DFS)
- CodeForces 682C Alyona and the Tree (树+dfs)
- codeforces 862B (二分图 dfs )之 Mahmoud and Ehab and the bipartiteness
- CodeForces - 711D Directed Roads(dfs判环)
- CodeForces 412D - Giving Awards (dfs)
- Codeforces 680D Bear and Tower of Cubesp【贪心+Dfs】有点难度啊T T
- Codeforces 337 D Book of Evil(树形dp,两遍dfs)
- Codeforces 825G Tree Queries(DFS)
- 【Codeforces 839 C. Journey】& dfs
- CodeForces 707D Persistent Bookcase (操作建树DFS|主席树+主席树)
- codeforces 598D dfs