枚举——2811关灯问题
二进制位运算处理该数字矩阵
#include <iostream>
#include <cstring>
#include <string>
#include <memory>
using namespace std;
int GetBit(char c,int i){//取字符第i位
return (c >> i) & 1;
}
void SetBit(char & c,int i,int v){//i位设为v
if(v)
c |= (1 << i);
else
c &= ~(1 << i);
}
void Flip(char & c,int i){//i位翻转
c ^= (1 << i);
}
void PrintResult(char result[]){//将字符输出成数字矩阵
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(){
char oriLights[5];//存放初始灯状态
char Lights[5];//某种方案灯变化过程
char results[5];//结果方案
char switchs;//当前行的开关方案
memset(oriLights,0,sizeof(oriLights));//初始化全0
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){//一共六位
memcpy(Lights,oriLights,sizeof(oriLights));
switchs = n;
for(int i = 0;i < 5; ++i){
results[i] = switchs;
for(int j = 0;j < 6; ++j){//变化灯
if(GetBit(switchs, j)){
if(j > 0)
Flip(Lights[i],j-1);
Flip(Lights[i],j);
if(j < 5)
Flip(Lights[i],j+1);
}
}
if(i < 4){
Lights[i+1] ^= switchs;
}
switchs = Lights[i];
}
if(Lights[4] == 0){
PrintResult(results);
break;
}
}
return 0;
}