1.
2811:熄灯问题(bailian)
#include<cstdio>#include<iostream>//cin cout
#include<string.h>//<string>ÊDz»¶ÔµÄ£¬Ó¦¸Ã¼Ó.h
#include<cstdlib>
#include<cmath>
#include<vector>//¶þάÊý×é
#include<algorithm>//
#include<set>//¼¯ºÏ
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn=1010;
const int inf=0x3fffffff;
int origin[5],result[5],lights[5];
void setBit(int &n,int d,int k){
if(k){
n|=(k<<d);
}
else{
n&=~(1<<d);
}
}
int getBit(int n,int k){
return (n>>k)&1;
}
void flip(int &n,int k){
n=n^(1<<k);
}
void print(int result[]){
for(int i=0;i<5;i++){
for(int j=0;j<6;j++){
int k=getBit(result[i],j);
printf("%d",k);
if(j<5)printf(" ");
}
if(i<4)printf("\n");
}
}
int main() {
memset(origin,0,sizeof(origin));
for(int j=0;j<5;j++){
for(int k=0;k<6;k++){
int number;
cin>>number;
setBit(origin[j],k,number);
}
}
for(int j=0;j<64;j++){
memcpy(lights,origin,sizeof(origin));
int switches=j;
for(int m=0;m<5;m++){
result[m]=switches;
for(int k=0;k<6;k++){
int binumber=getBit(switches,k);
if(binumber){
flip(lights[m],k);
if(k<5){
flip(lights[m],k+1);
}
if(k>0){
flip(lights[m],k-1);
}
}
}
if(m<4)lights[m+1]=lights[m+1]^switches;
switches=lights[m];
}
if(lights[4]==0){
print(result);
break;
}
}
system("pause");
return 0;
}
注意问题:1.与1异或-->求反;2.与0异或-->值不变。