题目:
5*6的格子,熄灯问题
分析:
这是一个指数型枚举:2^6(当然也可以是2^5)
采用位运算
只是要稍微注意一下,枚举的每一重都要将操作的变量更新,这里,输入的矩阵是不能操作的,应该找一个临时的矩阵,每一次操作的时候,先把输入的矩阵里面的内容复制过来,一开始没注意到,WA死了。。。
代码:
#include<iostream>
#include<cstring>
using namespace std;
void f(int& n){
if(n==1)n=0;
else if(n==0)n=1;
}
int a[10][10],ta[10][10],b[10][10];
int main(){
for(int i=1;i<=5;i++){
for(int j=1;j<=6;j++){
cin>>ta[i][j];
}
}
for(int i=0;i<64;i++){
for(int j=1;j<=5;j++){
for(int k=1;k<=6;k++){
a[j][k]=ta[j][k];
}
}
memset(b,0,sizeof(b));
for(int j=0;j<6;j++){
if((i>>j)&1){
b[1][j+1]=1;
f(a[1][j+1]);
f(a[1][j]);
f(a[1][j+2]);
f(a[2][j+1]);
}
}
for(int j=2;j<=5;j++){
for(int k=1;k<=6;k++){
if(a[j-1][k]){
b[j][k]=1;
f(a[j][k]);
f(a[j-1][k]);
f(a[j+1][k]);
f(a[j][k+1]);
f(a[j][k-1]);
}
}
}
int ok=1;
//cout<<i<<endl;
for(int j=1;j<=6;j++){
if(a[5][j])ok=0;
}
if(ok){
for(int j=1;j<=5;j++){
for(int k=1;k<=6;k++){
cout<<b[j][k]<<' ';
}
cout<<endl;
}
break;
}
}
return 0;
}