熄灯问题
问题描述:有一个由按钮组成的矩阵,其中每行有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"); } } }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.