熄灯问题

  问题描述:有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。 在矩阵角上的按钮改变3盏灯的状态 在矩阵边上的按钮改变4盏灯的状态 其他的按钮改变5盏灯的状态

Input

  第一行是一个正整数N,表示需要解决的案例数。每个案例由5行组成,每一行包括6个数字。这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。

Output

  对每个案例,首先输出一行,输出字符串“PUZZLE #m”,其中m是该案例的序号。接着按照该案例的输入格式输出5行,其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。每个数字以一个空格隔开。

View Code
#include<stdio.h>
int a[5][6];
int b[5][6];
int ans[5][6];
int dx[]={0,0,1,-1,};
int dy[]={1,-1,0,0};
void change(int x,int y)
{
 b[x][y]=1-b[x][y];
 int i;
 int xx,yy;
 for(i=0;i<4;i++)
 {
 xx=x+dx[i];
 yy=y+dy[i];
 if(xx>=0&&xx<5&&yy>=0&&yy<6) b[xx][yy]=1-b[xx][yy];
 }
}
int check(int m)
{
 int i,j,k=m;
 for(i=0;i<5;i++)
 {
 for(j=0;j<6;j++)
 {
 b[i][j]=a[i][j];
 ans[i][j]=0;
 }
 }
 for(i=0;i<6;i++)
 {
 ans[0][i]=k%2;
 k/=2;
 if(ans[0][i]) change(0,i);
 }
 for(i=1;i<5;i++)
 {
 for(j=0;j<6;j++)
 {
 if(b[i-1][j])
 {
 ans[i][j]=1;
 change(i,j);
 }
 }
 }
 for(i=0;i<6;i++)
 {
 if(b[4][i]) return 0;
 }
 return 1;
}
int main()
{
 int n,i,j;
 int t=1;
 scanf("%d",&n);
 while(n--)
 {
for(i=0;i<5;i++)
 {
 for(j=0;j<6;j++)
 {
 scanf("%d",&a[i][j]);
 }
 }
 for(i=0;i<64;i++)
 {
 if(check(i)) break;
 }
 printf("PUZZLE #%d\n",t++);
 for(i=0;i<5;i++)
 {
 printf("%d",ans[i][0]);
 for(j=1;j<6;j++) printf(" %d",ans[i][j]);
 printf("\n");
 }
 }
}
原文地址:https://www.cnblogs.com/hxsyl/p/3053325.html