POJ_2811,熄灯问题,同画家问题(POJ_1681),通过二进制枚举第一行的情况后逐行操作,判断最后一行是否全亮
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main(){
bool lights[7][8],copyl[7][8],ans[7][8];
for(int i=1;i<=5;i++) //行列编号从1开始
for(int j=1;j<=6;j++)
cin>>lights[i][j];
for(int allop=0;allop<64;allop++){ //第一行操作编号从0到2^列数-1
int copya=allop;
for(int i=1;i<=5;i++)
for(int j=1;j<=6;j++)
copyl[i][j]=lights[i][j];
bool op[7];
memset(op,0,sizeof(op));
memset(ans,0,sizeof(ans));
for(int i=1;copya!=0;i++){ //将第一行操作按二进制表示,位号从1到列数
if(copya%2) op[i]=1;
copya/=2;
}
for(int i=1;i<=6;i++) //第一行根据二进制进行操作
if(op[i]){
ans[1][i]=1;
copyl[1][i]=copyl[1][i]^1;
copyl[2][i]=copyl[2][i]^1;
copyl[1][i-1]=copyl[1][i-1]^1;
copyl[1][i+1]=copyl[1][i+1]^1;
}
for(int i=2;i<=5;i++) //第二到length行根据上一行进行操作
for(int j=1;j<=6;j++)
if(copyl[i-1][j]){
ans[i][j]=1;
copyl[i-1][j]=copyl[i-1][j]^1;
copyl[i][j]=copyl[i][j]^1;
copyl[i+1][j]=copyl[i+1][j]^1;
copyl[i][j-1]=copyl[i][j-1]^1;
copyl[i][j+1]=copyl[i][j+1]^1;
}
bool flag=1;
for(int i=1;i<=6;i++) //第length行检查
if(copyl[5][i]){
flag=0;
break;
}
if(flag) break;
}
for(int i=1;i<=5;i++){
for(int j=1;j<=6;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
return 0;
}