프로그래밍과 알고리즘 (b)는 북경 열거 문제 조명

#INCLUDE <비트 / STDC ++ H.>
은 USING 스페이스 STD]
[. 5] 숯 oriLights // 행렬의 상태를 저장할 수
숯 조명 [5]; // 매트릭스 램프의 변화를 구할 수
숯 결과 [5]; // 결과를 저장할 수
GETBIT INT (C CHAR, INT I)
{창 (C >> Ⅰ) 및 1].} // 상태를 제거한다. 내가 C 문자 1 작동에 적절한 장소.
보이드 SETBIT (CHAR & C가 값 int // I, INT의 ⅴ) (C)은 V로 i 번째 비트 인
 {IF (V) {C | = (. 1 << I)} // (V)가 1 인 경우, C는 동일하거나 i에 1을 좌측
다른
// C 나 좌측 1 비트 반전 같다 = ~ & (1 << I) (C)를
}
// C 반전 공극 FlipBit (INT I 숯 c &)를 저 비트
{
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 난 = 0; I <5; I ++)
    대 (INT J = 0; J <6; J ++) {
        INT (S);
        CIN >>이야;
        SETBIT (oriLights [I], J는, S);
    }
{- (; 64 <N- ++ N INT N- = 0)에 대한
    //이 가득한 보도에서 따르지 않는 것은 스위치의 각의 열거 시작; INT = N-switchs
    방어 적이기 (조명, 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.) 다음 라인에 // 처리
            등 [내가 + 1 ] ^ = switchs // 1 비트와 함께, XOR을 반전 배타적 이상이어야한다 0이 아닌 것
        조명 switchs = [내가]; // switchs는 스위치 행 상태에 따라 I + 1이다. 사이클로 다음 라인의 시작
    }
    IF (조명 == 0 [4.]) {
        OutputResult (T, 결과);
        BREAK;
    }
}
}
}

추천

출처www.cnblogs.com/Invictus-Gaming/p/12244502.html