포병 라인업 유사한 압력과 같은 제목의 느낌처럼 보이는
오랫동안 쓰기 거짓 솔루션으로 발견 :이 문제는 더 강한 제한 채우는 것입니다있다,
따라서, 경우에 사용 압 (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 ; }