AtCoderグランドコンテスト043 - A - レンジフリップルート検索

- レンジフリップルート検索

タイトルの意味:タイトルあなたが(W、H)と(1,1)から黒四角の最小数を取得する必要があり、あなたの行列を与えることです

ソリューション:私はもともと考えとして、この質問は、DFSは、すべての可能な方法を見つけることだった、彼らはTLEの結果、最小を比較し、試合後に質問を行い、DPも行うために使用することができます理解してください。ここでは、DPは、[I] [j]が代表点に到達した二次元配列DP [H] [W]を、規定(i、j)の場合も反転または必要性を表す黒ブロック、ブロックの最小数(サブジェクト説明黒ブロックは、その最小のそれぞれを決定するために、)白色ブロックを反転します。

TLEコードは以下のとおりであります:

書式#include <iostreamの> 
の#include <CStringの> 
の#include <アルゴリズム>
 に#define LL長い長い
 使って 名前空間はstdを、
int型 min_n = 100 * 100 + 5 int型の合計= 0 ; // 存储临时答案
INT H、W。
チャー PTR [ 150 ] [ 150 ]。
int型のネット[ 2 ] [ 2 ] = {{ 01 }、{ 10 }}。 
ブールチェック(int型X、INT Y){
     リターン(X <= H / * * /)&&(Y <= W / * * /); // 分析正当
} 
 ボイド DFS(int型 X、INT Y){ // すべてのトラバーサル、最小オペランド見つける
    IF(X == Y == H && W){ // これはの終わりに達する 
        ; min_n =分(min_n、SUM)を//は最小除去
        リターン ; //は、コール終了
    }
     // 検索を次のステップ
    のためにINT I = 0 ; I < 2 ; I ++ ){
         int型NET = X + NX [I] [ 0 ];
         int型 NY NET = Y + [I] [ 1 ]; // 検索次の操作
         // 次の動作が正当であると判断
        IF(チェック(NX、NY)){ / / もし法的
            IF(PTR [NX] [NY] == ' '){ //の位置が黒または白、黒プラス操作であると判定された 
                SUM ++ ; 
            } 
            DFS(NX、NY); 
            IF(PTR [ NX] [NY] == ' ' ){ 
                SUM - ; 
            } 
        } 
    } 
} 
int型のmain(){ 
    CINH >> W;
     のためのINT I = 1 ; I <= H; I ++ ){
         ためINT J = 1。 ; J <= W; J ++ ){ 
            CIN >> PTR [I]、[J]; 
        } 
    } // データ入力が完了すると、以下が開始される処理
     // 決意に、まず、第1ない
    IF(PTR [ 1 ] [ 1。 ==] ' ' ){ 
        SUM ++; // 動作インクリメントカウンタ
    } 
    DFSを(1。1); //はその後、検索開始からトラバース
    coutの<< min_n << てendl;
    リターン 0 ; 
}

ここではACコードは次のとおりです。

書式#include <iostreamの> 
の#include <CStringの> 
の#include <アルゴリズム>
 に#define LL長い長い
 使って 名前空間はstdを、
int型 min_n = 100 * 100 + 5 int型の合計= 0 ; // 存储临时答案
INT H、W。
チャー PTR [ 150 ] [ 150 ]。
int型のネット[ 2 ] [ 2 ] = {{ 01 }、{ 10 }}。 
ブールチェック(int型X、INT Y){
     リターン(X <= H / * * /)&&(Y <= W / * * /); // 分析正当
} 
 ボイド DFS(int型 X、INT Y){ // すべてのトラバーサル、最小オペランド見つける
    IF(X == Y == H && W){ // これはの終わりに達する 
        ; min_n =分(min_n、SUM)を//は最小除去
        リターン ; //は、コール終了
    }
     // 検索を次のステップ
    のためにINT I = 0 ; I < 2 ; I ++ ){
         int型NET = X + NX [I] [ 0 ];
         int型 NY NET = Y + [I] [ 1 ]; // 検索次の操作
         // 次の動作が正当であると判断
        IF(チェック(NX、NY)){ / / もし法的
            IF(PTR [NX] [NY] == ' '){ //の位置が黒または白、黒プラス操作であると判定された 
                SUM ++ ; 
            } 
            DFS(NX、NY); 
            IF(PTR [ NX] [NY] == ' ' ){ 
                SUM - ; 
            } 
        } 
    } 
} 
int型のmain(){
    CINH >> W;
     のためのINT I = 1 ; I <= H; I ++ ){
         ためINT J = 1。 ; J <= W; J ++ ){ 
            CIN >> PTR [I]、[J]; 
        } 
    } // データ入力が完了すると、以下が開始される処理
     // 決意に、まず、第1ない
    IF(PTR [ 1 ] [ 1。 ==] ' ' ){ 
        SUM ++; // 動作インクリメントカウンタ
    } 
    DFSを(1。1); //はその後、検索開始からトラバース
    coutの<< min_n << てendl;
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/blogxsc/p/12546865.html