从开始看这个题到现在解决都两三周了,先找到算法,然后两天编码,发现自己的好多能力需要培养。
算法:通过分析,可以知道,从第二行开始,前一行puzzle的状态就是后一行press的状态。所以后四行press的值
比较好求,如何保证press执行后,第一行puzzle全部为0是关键。比较笨的方法就是遍历第一行,共64种情况。
源码如下:
#include <iostream>
#include <memory.h>
#include <vector>
using namespace std;
bool result[5][6], puzzle_tem[5][6];
bool puzzle[5][6];
vector<int> out;
void press(int i, int j) {
if(i<0 || i>4) return;
if(j<0 || j>5) return;
puzzle_tem[i][j]=!puzzle_tem[i][j];
if(i>0) puzzle_tem[i-1][j]=!puzzle_tem[i-1][j];
if(i<4) puzzle_tem[i+1][j]=!puzzle_tem[i+1][j];
if(j>0) puzzle_tem[i][j-1]=!puzzle_tem[i][j-1];
if(j<5) puzzle_tem[i][j+1]=!puzzle_tem[i][j+1];
result[i][j]=1;
}
void input() {
int i,j;
for(i=0;i<5;i++) {
for(j=0;j<6;j++) {
cin>>puzzle[i][j];
}
}
}
void print_res(int n) {
int i,j,time;
for(time=0;time<n;time++) {
cout<<"PUZZLE #"<<time+1<<endl;
for(i=0;i<30;i++) {
cout<<out[i+time*30]<<" ";
if(i%6 == 5)
cout<<endl;
}
}
}
int main(int argc, char *argv[]) {
int i,j,row,col,timecount,time,temp;
cin>>time;
for(timecount=0; timecount<time; timecount++) {
input();
for(i=0;i<64;i++) {
memset(result,0,30);
memcpy(puzzle_tem,puzzle,30);
temp = i;
#if 0
for(j=0;j<6;j++) {
if(temp%2) press(0,j);
temp = temp/2;
}
#endif
for(j=0;j<6;j++) {
if((temp>>(5-j))&0x01)
press(0,j);
}
for(row=1;row<5;row++) {
for(col=0;col<6;col++) {
if(puzzle_tem[row-1][col]) press(row,col);
}
}
for(j=0;j<6;j++)
if(puzzle_tem[4][j])
break;
if(j==6) {
int m,n;
for(m=0;m<5;m++)
for(n=0;n<6;n++)
out.push_back(result[m][n]);
break;
}
}
}
print_res(time);
}