http://poj.org/problem?id=1222
#include<iostream>
#include<string>
#include<cstring>
#include<memory>
using namespace std;
char oriLights[5];
char lights[5];
char result[5];
void setbit(char &c,int i,int j)//写字节
{
if(i)//如果j位为1,j位处要写1
{
c |= (1<<j);
}
else//否则j位为0,j位写0
{
c |= 0;
}
}
char getbit(char c,int j)
{
return (c >> j) & 1;
}
void flip(char &c,int i)
{
c ^= (1 << i);
}
void print_bit(int t,char result[])
{
int i = 0;
int j = 0;
cout<<"PUZZLE #"<<t<<endl;
for(i = 0;i < 5;i ++)
{
for(j = 0;j < 6;j ++)
{
printf("%d",getbit(result[i],j));
if(j <5)
cout<< " ";
}
cout<<endl;
}
}
int main()
{
int i = 0;
int j = 0;
int t = 0;
int T = 0;
int s = 0;
int l = 0;
cin >> T;
for(t = 1;t <= T;t ++)
{
memset(oriLights,0,sizeof(oriLights));
for(i = 0;i < 5;i ++)
{
for(j = 0;j < 6;j ++)
{
cin>>s;
setbit(oriLights[i],s,j);//写字节
}
}
for(l = 0;l < 64;l ++)
{
int switchs = l;
memcpy(lights,oriLights,sizeof(oriLights));
for(i = 0;i < 5;i ++)
{
result[i] = switchs;
for(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)
{
print_bit(t,result);
break;
}
}
}
}