题目链接: link.
#include<stdio.h>
#include<string.h>
//对于第一行的灯枚举64种情况,对每一种情况求得第二行的状态
//然后逐行求出每一行的状态,判定(最后一行状态将前一行灯全部熄灭时自己是否是灭的)
//为了press()函数的通用,将数组设置成7行8列
/*
0 1 1 0 1 0
1 0 0 1 1 1
0 0 1 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0
*/
int buf[7][8] = {0},buf_copy[7][8],check[5][6] = {0};
void state()//利用二进制原理求解第一行的每一种操作,同时将其余行元素设为0
{
check[0][5] += 1;int i,j;
for(i = 5;i>=0;i--)
{
if(check[0][i]>1)
{
check[0][i] = 0;
check[0][i-1]++;
}
}
for(i=1;i<5;i++)
{
for(j = 0;j<6;j++)
{
check[i][j] = 0;
}
}
}
void press(int row,int lie)//进行按压操作
{
buf[row][lie] = !buf[row][lie];
buf[row+1][lie] = !buf[row+1][lie];
buf[row-1][lie] = !buf[row-1][lie];
buf[row][lie+1] = !buf[row][lie+1];
buf[row][lie-1] = !buf[row][lie-1];
}
void solve(int row)//根据上一行灯的状态求解对该行灯的操作(直接复制也可)
{
int i;
for(i=1;i<7;i++)
{
if(buf[row-1][i]==1)
{
press(row,i);
check[row-1][i-1] = 1;
}
}
}
void put()//输出
{
int i,j;
printf("the answer is: \n");
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
printf("%d ",check[i][j]);
}
printf("\n");
}
}
int main()
{
int i,j,sum=0;
for(i=1;i<6;i++)
{
for(j=1;j<7;j++)
{
scanf("%d",&buf[i][j]);
buf_copy[i][j] = buf[i][j];
}
}
for(i=1;i<64;i++)
{
state();
for(j = 0;j<6;j++)
{
if(check[0][j]==1)
{
press(1,j+1);
}
}
for(j=2;j<6;j++) solve(j);
for(j=1;j<7;j++) sum += buf[5][j];
if(sum==0) put();
else
{
memcpy(buf,buf_copy,sizeof(int)*56);
sum = 0;
}
}
return 0;
}