大砲のラインナップ同様の圧力のようなタイトルの感触のように見えます
長い時間のための書き込みは、偽の解決策であることが判明:この問題は、強い制限が満たすことである持っています、
従って、使用圧力のDP DPにケースのような[I] [S] [SS]、色の状態を表し、ポリシーi行目を満たします
外層3 ^ nは複雑DOのサブ列挙セットまたは
ない時間の複雑性O(3 ^ N * 2 ^ n個* n個)に考え出したこの道
実際には、直接探索DFSプルーニングを使用することができます
#include <iostreamの> する#include <アルゴリズム> の#include <CStringの> する#include <cstdioを> 使用して 名前空間をSTD。 チャーマップ[ 10 ] [ 10 ]。 INT T、N、M、回答、ケース= 0 。 無効 DFS(int型 I、int型 J、int型のステップ、int型のカウント){ 場合(ステップ> = ANS)のリターン; もし(==カウント0){アンス=分(ANS、工程)。返す;} もし(I == 1 || I> = N || J == 1|| J> = M)のリターン; もし((COUNT- 1)/ 5 + 1つの +工程> = ANS)のリターン; チャー TEMP [ 5 ]。 int型 Cntを= 0 ; ブールフラグ= 偽。 TEMP [ 0 ] = マップ[I] [J]。 TEMP [ 1 ] =マップ[I- 1 ] [j]は、TEMP [ 2 ] =マップ[I + 1 ] [J]。 TEMP [ 3 ] =マップ[I] [J- 1 ]; TEMP [ 4 ] =マップ[I] [J + 1 ]。 にとって(登録INT = K 0、K < 5 ; ++ K){ 場合(温度[K] == ' #')++ Cntを。 もし(温度[K] == ' '){フラグ= 真。ブレーク;} } もし(!フラグ&& CNT){ マップ[I] [J] =マップ[I- 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] = TEMP [ 0 ]; マップ[I - 1 ] [J] = TEMP [ 1 ];マップ[I + 1 ] [J] = TEMP [ 2 ]。 地図[I] [J - 1 ] = TEMP [ 3 ];マップ[I]、[J + 1 ] = TEMP [ 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 、ステップ、COUNT)。 他の DFS(I + 1、2 、ステップ、カウント); リターン; } int型のmain(){ IOS :: sync_with_stdio(偽); CIN >> T; 一方、(T-- ){ ++ ケース。 裁判所未満 << " 画像番号" <<ケース<< " :" ; CIN >> N >> M; アンス = 2147483647 ; int型のカウント= 0 ; 以下のために(レジスタINT iが= 1 ; I <= N。; J <= M; ++ J){ CIN >> マップ[I] [J]。 もし(マップ[I] [J] == ' #')++ カウント。 } } もし(マップ[ 1 ] [ 1 ] == ' #' ||マップ[ 1 ] [M] == ' #' ||地図[N] [ 1 ] == ' #' ||地図[N] [M] == ' #' ){ COUT << " 不可能" << ENDL << ENDL。 続け; } DFS(2、2、0 、COUNT)。 もし(ANS == 2147483647)はcout << " 不可能" << てendl; 他の coutの<<アンス<< てendl; coutの << てendl; } 戻り 0 。 }