hdu1175 LianliankanのDFS +剪定

Lianliankanの

問題の説明
「Lianliankanのは、」私は多くの人が演じてきたと信じています。チェス盤では、作品の多くを置く:私がゲームのルールをご紹介ここでは、重要ではありませんプレイしたことがありません。二つの同一の部分が(この行は、他の部分を通過することができない)一緒に接続され、2つ以下旋回ラインの回数ことができる場合、2つのピースはボード上の線によって除去することができます。私は申し訳ありません、私はLianliankanのをプレイしていなかったので、生徒たちに相談し、接続は外部から周りに行くことはできませんが、実際には、これは間違っています。今、災害につながる、それだけで間違っている、と周囲からの接続をバイパスすることはできません。
プレイヤーは、マウスをクリックして、それらを排除しようとし、2枚を持って、その後、2つの正方形を決定するために、ゲームの背景を排除することはできません。今すぐあなたのタスクは、デーモンを書くことです。
 

 

入力
入力データの複数のセット。各データセットの最初の行は、N 2つの正の整数であり、M(0 <N < = 1000,0 <M <1000)、 それぞれ、ボードの行と列の数。次のn行において、各行について説明非負整数mチェス盤市松分布を有します。0片の種類を表す正の整数であり、この位置はポーンではないことを示しています。次の行は、正の整数q(0 <Q <50)であり 、 以下のq番目の質問を表します。次の行で、Qは、それぞれの行は、4つの正の整数X1、Y1、X2、Y2を有し、X1は、行と列を排除することができ、最初の列片Y1×2 Y2行ピースの問い合わせを表します。N = 0、M = 0、入力の終わり。
注:お問い合わせの間に関係がない、現在の状態に向けられています!
 

 

出力
出力の一つの行に対応する入力データの各セット。私たちが「YES」の出力を排除することができた場合は、出力が「NO」にすることはできません。
 

 

サンプル入力
3 4
1 2 3 4
0 0 0 0
4 3 2 1
4
1 1 3 4
1 1 2 4
1 1 3 3
2 1 2 4
3 4
0 1 4 3
0 2 4 1
0 0 0 0
2
1 1 2 4
1 3 2 3
0 0
サンプル出力
はい
NO
NO
NO
NO
はい
#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
使用して名前空間STD; 
 
int型迷路[1010] [1010]; 
BOOL VIS [1010] [1010]; 
int型SX、SY、EX、EY、
フラグにBOOL、
INT N-、M、Qは、
INT dicx [] = {1、-1,0,0}; 
int型DICY [] = {0,0,1、-1}、
 
ボイドDFS(INTのX、Y int型、DICをINT、 {)INTをオン
    ;(// 2又は巻き数よりも大きい終了することが見出されているフラグ)リターンで> 2 ||を点灯した場合
    (== 2 &&(Xターン場合 != 0 &&(Y-EY)= 0)リターン-ex)を; //剪定:同じ行をオンにした後かどうか2つのターゲットを決定する
    場合(X == EX && Y == {<= 2 EY &&ターン) //エンド検索
        。フラグ= 1; 
        返す; 
    } 
    (I 0 = int型のために、私は4 <; ++ i)が{ // 検索四方
        INT dicx XX = X + [I]; 
        DICY YY = Y +をINT [I]。
        IF(XX <1 || XX> N || YY <1 || YY> M || VIS [XX] [YY])続ける; // 境界ケースを
        IF(迷路[XX] [YY ] == 0 || (XX YY == == && EX EY)){ 
            VIS [XX] [YY] = 1; 
            IF(DIC == - == DIC 1 || I)開始点として、またはしないとターン同じ方向に//そうでない場合にはケース。ステアリング、電流方向がIで示される
                DFS(XX、YY、I、ターン); 
            他の
                DFS(XX、YY、Iは、+を回す1); // + 1は、そうでなければオン
            VIS [XX] [YY]が= 0; 
        } 
    } 
    リターン; 
} 
 
(INTメイン){ 
    ながら(〜scanfの( "%のD%のD"、およびN-、&M)){ 
        IF(N - == 0 && M == 0)
            BREAK; 
        のmemset(迷路、0、はsizeof(迷路) ); 
        
        のための(INT I = 1; I <= N、I)は、++ 
            (INTのために1 = J; J <= M。++ J) 
                のscanf( "%d個"、&迷路[I] [J])。
        
        scanf関数( "%のD"、&Q) 
        (I = 0をint型のために、I <Q、Iは++){ 
            scanfの( "%D %% D D D%"、およびSX、&SY、EX&&O);
            のmemset(VIS、0、はsizeof(VIS)); 
            
            = 0フラグに; //初期化する
            場合(迷路[SX] [SY ] ==迷路[EX] [EY] &&迷路[SX ] [SY])
                DFS(SX、SY、-1,0); //最初の方向が-1 
                
            (フラグにIF)のprintf( "N- \ YES"); 
            他のprintf( "NO \ N-"); 
        } 
    } 
    戻り0; 
}

  

 

 

おすすめ

転載: www.cnblogs.com/lyj1/p/11516975.html