Fox And Two Dots-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:

  1. These k dots are different: if i ≠ j then di is different from dj.
  2. k is at least 4.
  3. All dots belong to the same color.
  4. 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
knew
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).

The meaning of problems: given a string array size n * m, and asked whether the presence of the array of rings of the same letter, one shaped as in FIG case, i.e. that constitute the ring.

AAA vB 
vB the ABA
AAA
(1) (2)

Ideas: the former to be the last time bfs, search (but can not go back), to a point on every search with vis mark at each point to four weeks.

If you search to point vis labeled, but also, and this point is the same color, then that certainly hit the ring, indicating that it holds.

Reprinted from: https://blog.csdn.net/wyg1997/article/details/52208683

#include <cstdio> 
#include <the iostream> 
#include <CString>
 the using  namespace STD;
 int n-, m;
 char MP [ 55 ] [ 55 ];
 int VIS [ 55 ] [ 55 ];
 int the dir [ . 4 ] [ 2 ] {{= - . 1 , 0 }, { 0 , . 1 }, { . 1 , 0 }, { 0 , - . 1 }};
 BOOL ANS;
 // they do not go through a point has been labeled (nx, ny), it may prove to be Yes. 
void dfs(int x,int y,int nx,int ny)
{
    if(vis[x][y]){
        ans=true;
        return;
    }
    vis[x][y]=true;
    for(int i=0;i<4;i++){
        int xx=x+dir[i][0],yy=y+dir[i][1];
        if(xx==nx&&yy==ny)
            continue;
        if(mp[xx][yy]==mp[x][y]){
            dfs(xx,yy,x,y);
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
        }
        memset(vis,false,sizeof(vis));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++) {
                 IF (! VIS [I] [J]) { 
                    DFS (I, J, - . 1 , - . 1 ); // (0,0) of the previous node is (-1, -1) 
                }
                 IF (ANS ) {
                     BREAK ; 
                } 
            } 
            IF (ANS)
                 BREAK ; 
        } 
        IF (ANS) 
            COUT << " Yes " << endl;
         the else 
            COUT << " No " << endl;
    }
    return 0;
}

 

Guess you like

Origin www.cnblogs.com/LJHAHA/p/11209371.html