プログラミングとアルゴリズム(b)は北京の列挙は問題を点灯します

#include <ビット/ STDC ++ H.>
使用して名前空間STD;
[5]チャーoriLights; //行列の状態を保存することができる
チャーライトを[5]; //マトリックスランプの変化保存できる
チャー結果[5]; //結果を保存することができ
GETBIT INT(C CHAR、INT I)
{リターン(C >> I)は&1;} //状態のいずれかを取り外します。文字c iを1での動作との適切な場所、。
ボイドSetBit(チャー&Cは、int型 // I、int型V) cがVへのi番目のビットである
 {IF(V){C | =(1 << I);} // vが1である場合、cはに等しく、又は1 iは左

// cが1に等しく、ビット反転は、I左、cは=〜&(1 << I)
}
ボイドFlipBitを(チャーC&と、I INT)// cは反転するIビット
{
C ^ = (1 << I); //ビット単位XOR
}
ボイドOutputResult(T int型、チャー結果[])//出力
{
    COUT << "パズル#" << T << ENDL;
    (INT I = 0 ; I <5; I ++){
    (INT J = 0; J <6; J ++){
        COUT << GETBIT(結果[I]、J);
        IF(J <5)COUT << "";
    }
    COUT < <ENDL;}
}
int型のmain(){
int型T;
CIN >> T;
(INT 1 = T; T <= T。 ++ T){
        memsetの(oriLights、0、はsizeof(oriLights))。
    以下のために(INT I = 0; I <5; I ++)
    のための(INT J = 0; J <6; J ++){
        int型、S。
        cinを>>秒;
        SetBit(oriLights [i]は、J、S)。
    }
{ - (++ N; N- <64 INT N- = 0)のための
    INT = N-switchs;全押しは、スイッチの各々の列挙始まりから//は従わない
    のmemcpy(ライト、oriLights、はsizeof( oriLightsを)); / 光へ/コピー元のデータが操作を行く
    ため(INT I = 0; I <5; ++ I){
        結果[I] = switchs;
        {(。; J <6 J ++ INT J = 0)のための
            IF(GETBIT (switchs、J)/ * j番目のビットが1である場合、スイッチ* /){押す
                jはの左端の列にない場合//)> 0をIF(jは
                    FlipBit(点灯[i]は、J -1) ;
                FlipBit(点灯[I]、J);
                IF(J <5。)
                    FlipBit(点灯[I]、+ J. 1);
            }
        }
        IF(I <4。)次のライン上の//処理
            ライト[I + 1 ] ^ = switchs; // 1ビットとを排他的に反転されるか、または、0のXORではないであろう
        switchs =点灯[I]; // switchs スイッチ行の状態に応じてI + 1です。サイクルダウン次の行の先頭
    }
    IF(ライト== 0 [4]){
        OutputResult(T、結果);
        BREAK;
    }
}
}
}

おすすめ

転載: www.cnblogs.com/Invictus-Gaming/p/12244502.html