トピックリンク:https://codeforces.com/contest/1281/problem/D
問題の意味:1 * Xグリッドを選択することができ、X * 1(Xは任意の値である)、更なる任意の方向をコピーし、示されるように、二段階の選択PPAPアップ、及びAPPP PAAAはPPAPとなっています。
彼は、全体像はAが必要とどのように多くのステップになり尋ねました。
アイデア:どうやらだけ0,1,2,3,4、不可能6例
不可能:全P
ステップ0:すべてのA
ステップ1:最初の行、最後の行、最初の列、フルAと最後の
ステップ2:フルAの中央線、完全な中央列A、四隅Aと
ステップ3:上記の場合、最初の行、最後の行、最初の列を満たさない場合、最後のものはAを有しています
ステップ4:上記の状況がフルを満たしていません
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 65 ; チャーG [MAXN] [MAXN]。 INT R、C、行[MAXN]、COL [MAXN]。// COL行の行列 ボイド解く() { memsetの(行、0、はsizeof 行)。 memset(COL、0、はsizeof COL)。 int型の合計= 0 ; 以下のために(INT iが= 1 ; I <= R I ++ ) { ため(INT J = 1 ; J <= C; jは++) { 場合(G [I] [J] == ' A ')COL [I] ++、行[J] ++、合計++ 。 } } もし(合計== 0)のprintf(" MORTAL \ n " ); それ以外の 場合(合計== R * C)のprintf(" 0 \ N " ); そう であれば(行[ 1 ] == R ||行[C] == R || COL [ 1 ] == C || COL [R] == C)のprintf(" 1 \ n " ); 他 { int型フラグ= 0 。 以下のための(int型 I =2、I <R、I ++)場合(COL [I] == C)フラグ= 1 。 以下のために(INT iが= 2、I <C; I ++)場合(行[I] == R)フラグ= 1 。 もし(フラグ== 1 || G [ 1 ] [ 1 ] == ' A ' || G [R] [ 1 ] == ' A ' || G [ 1 ]、[C] == ' A ' || G [R] [C] == ' A ')のprintf(" 2 \ n " ); 他の 場合(行[1 ]> 0 ||行[C]> 0 || COL [ 1 ]> 0 || COL [R]> 0)のprintf(" 3 \ n " ); 他のprintf(" 4 \ N " ); } } int型のmain() { int型T。 scanf関数(" %のD "、&T)。 一方、(T-- ) { scanf関数(" %D%D "、&R&C)。 以下のための(int型 I = 1; I <= R; I ++)のscanf(" %sの"、G [I] + 1 )。 解決する(); } 戻り 0 。 }