熄灯问题

本文介绍了解决按钮矩阵中灯状态改变的问题,通过分析矩阵布局和按钮操作原理,提出了一个有效的方法来解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  问题描述:有一个由按钮组成的矩阵,其中每行有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");
 }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值