题意:
当前有一个6*5的矩形,然后输入中给出每个灯的状态,1表示当前灯是亮的,0表示灯是灭的。然后让你给出一种能把所有的灯都熄灭的方案,并输出之。其中输出的矩阵中1表示 按这个位置的灯,0表示不按这个位置的灯。
思路:
数据范围也不是很大。。直接暴力就好了。。
我是对第一行进行枚举,然后只要把第1行搞定了就可以搞第二行,第三行,,,依次类推。
我用一个num[i][j]表示当前格子的状态是开着的还是关着的。press数组记录这个格子是否有被按过(1表示按了,0表示没有按),puz数组是用来存灯的最初状态(即为亮还是没亮)。
然后要求当前格子的状态,它只与当前格子是否按了press[i][j],与最初的灯是否亮的puz[i][j],与上一行的press[i-1][j],与前一列的press[i][j-1],后一列press[i][j+1]有关,所以num[i][j]就等于以上和再mod2就可以求出当前格子的状态了。
p.s:为了方便,我们把5*6的矩阵扩大为6*8的矩阵,因为为了当求第一行和第一列的时候方便一点嘛~~
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<time.h>
using namespace std;
typedef __int64 ll;
typedef unsigned __int64 ULL;
#define pi acos(-1.0)
#define Ex exp(1.0)
#define maxn 11
int press[maxn][maxn],puz[maxn][maxn];
int num[maxn][maxn];
int main(){
int T,gg=1;
scanf("%d",&T);
while(T--){
memset(puz,0,sizeof(puz));
memset(press,0,sizeof(press));
memset(num,0,sizeof(num));
for(int i=1;i<=5;i++){
for(int j=1;j<=6;j++){
scanf("%d",&puz[i][j]);
}
}
int ff=0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
for(int l=0;l<2;l++){
for(int m=0;m<2;m++){
for(int n=0;n<2;n++){
memset(press,0,sizeof(press));
memset(num,0,sizeof(num));
press[1][1]=i; press[1][2]=j;
press[1][3]=k; press[1][4]=l;
press[1][5]=m; press[1][6]=n;
for(int hang=1;hang<=5;hang++){
for(int lie=1;lie<=6;lie++){
if(hang==1) num[hang][lie]=(puz[hang][lie]+press[hang][lie]+press[hang-1][lie]+press[hang][lie-1]+press[hang][lie+1])%2;
else if(num[hang-1][lie]==1){
press[hang][lie]=1;
}
else if(num[hang-1][lie]==0) press[hang][lie]=0;
}
if(hang==1) continue;
for(int lie=1;lie<=6;lie++){
num[hang][lie]=(puz[hang][lie]+press[hang][lie]+press[hang-1][lie]+press[hang][lie-1]+press[hang][lie+1])%2;
}
}
ff=0;
for(int i=1;i<=6;i++){
if(num[5][i]){
ff=1;
break;
}
}
if(!ff) break;
}
if(!ff) break;
}
if(!ff) break;
}
if(!ff) break;
}
if(!ff) break;
}
if(!ff) break;
}
printf("PUZZLE #%d\n",gg++);
for(int i=1;i<=5;i++){
for(int j=1;j<=6;j++){
if(j!=6) printf("%d ",press[i][j]);
else printf("%d\n",press[i][j]);
}
}
}
return 0;
}