poj1222(开关灯来自(程序设计与算法(二)算法基础mooc))

#include<iostream>
#include<cstring>
using namespace std;
char oriLights[5];//一个字符一个字节8个比特
char lights[5];///
char Result[5];
int GetBit(char c,int i){////得到c第i位的内容
    return (c>>i)&1;
}

void SetBit(char &c,int i,int v){///存灯///
    if(v){
        c=c|(1<<i);
    }
    else{
       c=c&~(1<<i);
    }
}
void FlipBit(char &c,int i){///c的第i位翻转
    c^=(1<<i);
}

void Output(int t,char Result[]){///输出结果字符
    cout<<"PUZZLE #"<<t<<endl;
    for(int i=0;i<5;i++){
        for(int j=0;j<6;j++){
                cout<<GetBit(Result[i],j);
                if(j<5)
                    cout<<" ";
        }
        cout<<endl;
    }
}


int main(){
    int T;
    cin>>T;
    for(int t=1;t<=T;t++){

        for(int i=0;i<5;i++){//输入
            for(int j=0;j<6;j++){
                int s;
                cin>>s;
                SetBit(oriLights[i],j,s);///存灯状态
            }
        }

        for(int n=0;n<64;n++){///每行状态
          int switchs=n;
          memcpy(lights,oriLights,sizeof(oriLights));///字符复制
          for(int i=0;i<5;i++){
                Result[i]=switchs;///存开关
            for(int j=0;j<6;j++){
                if(GetBit(switchs,j)){///为1
                    if(j>0)
                        FlipBit(lights[i],j-1);///左
                        FlipBit(lights[i],j);//中
                    if(j<5)
                        FlipBit(lights[i],j+1);///右
                }
            }
            if(i<4){
                lights[i+1]^=switchs;//和下一行比较-反转
            }
            switchs=lights[i];///记录第i行的switches
          }
          if(lights[4]==0){///第四行为0
            Output(t,Result);
            break;
          }
        }

    }
 return 0;
}

猜你喜欢

转载自blog.csdn.net/lianghudream/article/details/79343504
今日推荐