问题讲解:
代码如下:
#include <iostream>
#include<memory>
#include<cstring>
#include<string>
using namespace std;
char oriLinghts[5];//存放输入原始的灯
char lights[5];//变化灯的矩阵
char result[5];//最终结果矩阵
int GetBit(char c,int i)//取c的第i位的情况
{
return (c >> i) & 1;
}
void SetBit(char & c,int i, int v)//设置字符c的第i位改为v
{
if(v){//v是1
c |= ( 1 << i);//c的第i位变成1
}
else {
c &= ~(1 << i);//
}
}
void FlipBit(char &c , int i)//把c的第i位翻转
{
c ^=( 1 << i);//异或运算
}
void OutputResult(int t,char result[])
{
cout << "PUZZLE #" << t << endl;
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()
{
int T;
cin >> T;
for(int t = 1 ; t<= T ; ++t){
for(int i = 0 ;i < 5;++i)
for(int j = 0;j < 6; ++j){
int s;
cin >> s;
SetBit(oriLinghts[i],j,s);
}
for(int n = 0;n < 64 ; ++n){
int switchs = n;
memcpy(lights,oriLinghts,sizeof(oriLinghts));//复制orilights到lights
for(int i = 0;i < 5;++i){
result[i] = switchs;
for(int j = 0;j< 6; j++){
if(GetBit(switchs,j)){
if (j > 0)
FlipBit(lights[i],j-1);
FlipBit(lights[i],j);
if ( j < 5)
FlipBit(lights[i],j+1);
}
}
if(i < 4 )
lights[i + 1] ^= switchs;
switchs = lights[i];
}
if(lights[4] == 0){
OutputResult(t,result);
break;
}
}
}
return 0;
}