--UCF2015 H 검색

포병 라인업 유사한 압력과 같은 제목의 느낌처럼 보이는

오랫동안 쓰기 거짓 솔루션으로 발견 :이 문제는 더 강한 제한 채우는 것입니다있다,

 따라서, 경우에 사용 압 (DP)의 DP 같이 [I]가 [S]는 [SS]가 색의 상태를 나타내고, 정책, i 번째 행을 채우고

 또는 외층 3 ^ N은 서브 복잡도 DO 세트 열거

    시간 복잡도 O하지 상상이 방법 (3 ^ 2 ^ N * N * N)

사실, 당신은 직접 검색 DFS 가지 치기를 사용할 수 있습니다

사용법 #include <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE <CString을> 
#INCLUDE <cstdio>
 사용  공간을 성병; 

 맵 [ 10 ] [ 10 ];
INT T, N, M, Ans By의 케이스 = 0 ; 

보이드 DFS ( INT I, INT J, INT 단계 INT의 카운트) {
     경우 (단계> = ANS) ;
    경우 (개수 == 0 ) {= Ans By의 분 (ANS 단계); 반환 }
     경우 (I == 1 || I> J = N || == 1|| J> = M) ;
    경우 ((Count- 1 ) / 5 + 1 + 단계> = ANS) ;
     온도 [ 5 ];
    INT 된 CNT = 0 ; 부울 플래그 = 거짓 ; 
    온도 [ 0 ] = 맵 [I] [J] 
    온도 [ 1 ] = 맵 [Ⅰ- 1 ] [J] 온도 [ 2 ] = 맵 [I + 1 ] [J]; 
    온도 [ 3 ] = 맵 [i]는 [J = 1 ] 온도 [ 4 ] = 맵 [i]는 [J + 1 ];
    ...에 대한(등록 INT K = 0 ; K < 5 ; ++ K)을 {
         경우 (온도 [K] == ' # ' ) ++ 에서 Cnt;
        경우 (온도 [K]를 == ' . ' ) {플래그 =  ; 침입 } 
    } 
    경우 (플래그 &&! 에서 Cnt) { 
        맵 [I] [J] = 맵 [Ⅰ- 1 ] [J] = 맵 [I + 1 ] [J] = 맵 [i]는 [J - 1 ] = 약도 [I] [J + 1 ] = '를 @ ' ;
        만약 (j + 1 <M) DFS (I, J + 1단계 + 1 , Count- 에서 Cnt);
        다른 DFS는 (i + 1 , 2 , 단계 + 1 , Count- 에서 Cnt); 
        맵 [I] [J] = 온도 [ 0 ]; 
        맵 [I - 1 ] [J] 온도 = [ 1 ] 맵 [I + 1 ] [J] = 온도 [ 2 ]; 
        맵 [I] [J - 1 ] = 온도 [ 3 ] 맵 [I] [J + 1 ] = 온도 [ 4 ]; 
    } 
    경우 (I == 2 && 맵 [ 1 ] [J] == ' # ' )반환 ;
    만약 (j == 2 && 맵 [I] [ 1 ] == ' # ' ) ;
    경우 (I N- == 1 && 맵 [N] [J] == ' # ' ) ;
    만약 (j M- == 1 && 맵 [I] [M] == ' # ' ) ;
    만약 (j + 1 <M) DFS (I, J + 1 , 스텝 카운트);
    다른 DFS (I + 1 , 2 , 단계 카운트);
    반환 ; 
}

int로 주 () { 
    IOS를 :: sync_with_stdio ( 거짓을 ); 
    CIN >> T;
    동안 (T-- ) {
         ++ 케이스; 
        cout과 << " 이미지 # " << 케이스 << " : " ; 
        CIN >> N >> M; 
        ANS = 2147483647 ;
        INT의 카운트 = 0 ;
        위한 (레지스터 INT 난 = 1 ; I <= N;; J <= M; ++ j)는 { 
                CIN >> 맵 [I] [J]
                경우 (MAP [I] [J] == ' # ' ) ++ 카운트; 
            } 
        } 
        경우 (맵 [ 1 ] [ 1 ] == ' # ' || 맵 [ 1 ] [M] == ' # ' || 맵 [N] [ 1 ] == ' # ' || 맵 [N] [M] == ' # ' ) { 
            COUT << " 불가 " << ENDL << ENDL;
            계속 ; 
        } 
        DFS ( 2 , 2 , 0 , 카운트);
        경우 (ANS == 2147483647 ) COUT << " 불가 " << ENDL;
        다른 COUT << Ans By의 << ENDL; 
        COUT << ENDL; 
    } 
    
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/zsben991126/p/12369643.html