問題の意味:地図上の完全な点では、ライン、行または文字は、任意の長さを染色するたびに、染料文字の一種の和を開始するために、文字が後カバーすることができる文字の先頭から連続していなければなりません。
それは、出力ビデオいくつかの文字は、各文字と、次に出力することと水平および垂直座標をオフ描画の開始を満たす場合Qは、所定のパターンを満たします。
思考:図アナログ記憶されている最小最大水平および垂直座標を、各文字のX1、X2、Y1、Y2の記録位置と、それは、X1、X2、Y1、Y2が初期値でない場合、各文字のために、表示され、その後それは数字(上書きされません)に出演していたが、その後、手紙を満たすためにバインドされている、×1 ==×2 || y1を== Y2;
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
チャー MP [ 2005 ] [ 2005 ]。
int型 ×1 [ 30 ]、X2 [ 30 ]、Y1 [ 30 ]、Y2 [ 30 ]。
INT のmain()
{
int型N、M。
int型、それは= 1 ;
scanf関数(" %d個"、&それ)。
一方、(it-- )
{
scanf関数(" %d個の%のD "、&N、&M)。
以下のための(int型私は=1 ; I <= N。I ++ )
のscanf(" %sの"、MP [I] + 1 )。
以下のために(int型 i = 1 ; iは<= 26 ; I ++ )
{
X1 [i]は = 9999 。
Y1の[I] = 9999 。
×2 [I] = - 9999 ;
Y2 [I] = - 9999 。
}
のために(int型 I = 1は iが++; iがn = < )
のために(INTJ = 1 ; J <= M。J ++ )
{
もし!(MP [I] [J] = ' ' )
{ int型 NUM = MP [I] [J] - ' ' + 1 。
X1 [NUM] = 分(X1【か】I)。
X2 [NUM] = MAX(X2【か】I)。
Y1 [NUM] = 分(Y1 [か]、J);
J2 [NUM] = MAX(Y2 J、[か])。
}
} のIntフラグ= 1 。
int型生きる[ 30
];
int型 CNT = 0 ;
memsetの(ライブ、0、はsizeof (ライブ));
以下のために(int型 i = 1 ; iは= < 26 ; I ++ )
{
場合(!X1 [I] = 9999の!&& Y1 [I] = 9999 )
{
場合(X1 [I] == X2 [I])
{
CNTを = 私;
用(INT J ++; J <= Y2 [I] J = Y1 [I] )
であれば(MP [X1 [I]、[J] <(' A' + I- 1 ))
{
フラグ = 0 。
破ります;
}
ライブ[I] = 1 。
}
そう であれば(Y1 [I] == Y2 [I])
{
CNT = I。
用(int型 J = X1の[I]; J <= X 2 [i]は、J ++ )
{
場合(MP [J] [Y1 [I] <(' ' + I- 1 ))
{
フラグ = 0 。
破ります;
}
}
ライブ[I] = 1 。
}
他
{
フラグ = 0 。
破ります;
}
}
}
// ため(; iは5 = <; I = 1 int型私は++)
// のprintf( "%D%D%D%D \ n"は、X1 [i]は、X2 [I]、Y1 [I] 、Y2 [I])。
もし(フラグ== 0 )
printf(" NO \ nを" );
他
{
のprintf(" YES \ N%Dを\ n " 、CNT)。
以下のために(int型 i = 1 ; iは= CNTを<; iは++ )
{
場合(ライブ[I] == 0 )
{
// のprintf( "???")。
用(int型 J = I + 1、J <= 26 J ++; )
{
場合(ライブ[J] == 1 )
{
printf(" %D%D%D%D \ n " 、X1 [J]、Y1の[jを]、X2 [J]、Y2 [J])。
破ります;
}
}
}
他
のprintf(" %D%D%D%D \ n " 、X1 [i]は、Y1 [I]、X2 [I]、Y2 [I])。
}
}
}
}
ます。https://www.cnblogs.com/dongdong25800/p/11083083.htmlで再現