폭스와 두 점-DFS

폭스 시엘은 "2 점"라는 모바일 퍼즐 게임을하고있다. 기본적인 수준 크기의 기판 상에 재생되는  N  ×  m의  이런 세포 :

각 셀은 일부 색상이있는 점을 포함합니다. 우리는 서로 다른 색상을 표현하는 다른 대문자 라틴 문자를 사용합니다.

이 게임의 핵심은 같은 색의 도트를 포함하는주기를 찾을 수 있습니다. 예로서, 원을 형성하는 화상의 푸른 4 점을 고려한다. 공식적으로, 우리는 점들의 시퀀스를 호출  거라고 1 ,  D 2 , ...,  D 케이 는 다음 조건을 만족하는 경우에만, 사이클 :

  1. 이러한  k 개의  점이 상이하다 : 만약  내가  ≠  J를  다음  거라고 제가  상이한  차원 J .
  2. K는  적어도 4이다.
  3. 모든 점은 같은 색에 속한다.
  4. 모든  1 ≤   ≤  K  - 1 :  (D)의 I  및  D는 I  + 1  에 인접한다. 또한,  d는 케이  와  (D) (1)는  또한 인접한다. 셀  X  및  Y는  그들이 경계를 공유하는 경우, 인접 불린다.

가 존재하는지 확인  필드에서주기를.

입력

첫 번째 라인은 두 정수 포함  N  과  m  ( 2 ≤  N ,  m의  기판의 행과 열의 수 : ≤ 50).

그런 다음  n 개의  라인은 각 행은 문자열로 구성된 포함에 따라  m의  문자 각 라인에서 점의 색상을 표현합니다. 각 문자는 대문자 라틴어 문자입니다.

산출

출력 " 존재 예"경우  주기와 " 아니오"그렇지.

입력
3 4 
AAAA
ABCA
AAAA
산출
입력
3 4 
AAAA
ABCA는
알고 있었다
산출
아니
입력
4 4 
YYYR
BYBY
BBBY
BBBY
산출
입력
7 6 
AAAAAB
ABBBAB
ABAAAB
ABABBB
ABAAAB
ABBBAB
AAAAAB
산출
입력
2 13 
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
산출
아니

노트

첫 번째 샘플 테스트에서 모두 ' A'주기를 형성한다.

두 번째 샘플에서 이러한주기가 없다.

세 번째 시료 ( '위의 그림에 표시되는 Y'= 황색, ' B'= 청색, ' R'= 빨간색).

문제의 의미 문자열 배열 크기 n의 m *에 부여하고, 요청 여부 환을 구성하는 동일한 문자도 케이스 모양 하나, 즉 고리의 배열의 존재.

AAA VB에서 
VB에서 ABA
AAA
(1) (2)

아이디어 : 전자는 지난 시간 BFS, 검색 할 수 있습니다 (하지만 다시 갈 수 없다) 4 주 각 지점에서 마주 표시가있는 모든 검색에 포인트.

당신이 가리 키도록 검색하면 마주 표시뿐만 아니라,이 점은 확실히이 보유하고 있음을 나타냅니다 반지를 공격 한 후 같은 색이다.

:에서 재판 https://blog.csdn.net/wyg1997/article/details/52208683

#INCLUDE <cstdio> 
#INCLUDE <iostream> 
#INCLUDE <CString을>
 은 USING  스페이스 STD;
 INT N-, m,
  MP [ 55 ] [ 55 ],
 int로 VIS [ 55 ] [ 55 ],
 int로 디렉터리의 [이 . 4 ] [ 2 ] {{= - . 1 , 0 }, { 0 , 1. }, { 1. , 0 }, { 0 , - 1. }}
 BOOL ANS;
 // 그들이 지점을 통과하지 않는이 분류되었습니다 (NX, NY), 그것은 예를 증명할 수 있습니다. 
무효DFS ( INT의 X, INT의 Y, INT NX, INT NY) 
{ 
    경우 (힘 [X] [Y]) { 
        ANS = ;
        반환 ; 
    } 
    힘은 [X]는 [Y]는 = ;
    위한 ( int로 I = 0 ; i가 < 4 ; I ++ ) {
         INT XX = X + DIR [I] [ 0 ], Y YY + = DIR을 [I] [ 1 ];
        경우 (XX == NX && 전년 동기 대비 == 뉴욕)이
             계속 ;
        경우 (MP [XX] [YY] == MP [X] [Y]) {
            DFS (XX, YY, X, Y); 
        } 
    } 
} 
INT 의 main () 
{ 
    동안 (~는 scanf ( " %의 D % d에 " , N, m)) {
         위해 ( int로 I = 0 ; i가 N <; 내가 ++ ) { 
            는 scanf ( " %의 S ' , MP [ 나는]); 
        } 
        memset 함수 (마주, 거짓 , 는 sizeof (마주));
        위한 ( int로 I = 0 ; I <N는 난이 ++ ) {
              ( INT의 J = 0 ; J <m, J ++) {
                 경우 (! 힘 [I] [J]) { 
                    DFS (I, J, - 1 - 1 ); // (0,0)的前一个节点为(-1, -1) 
                }
                 의 경우 (ANS) {
                     중단 ; 
                } 
            } 
            경우 (ANS)
                 휴식 ; 
        } 
        경우 (ANS) 
            COUT << " " << ENDL;
        다른 
            cout과 << " 아니오 " << endl의;
    }
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/LJHAHA/p/11209371.html