枚举-熄灯问题
问题讲解:
#include<stdio.h>
int puzzle[10][10];
int press[10][10];
int check()
{
for(int i=1;i<5;i++)
{
for(int j=1;j<=6;j++)
{
press[i+1][j]=(puzzle[i][j]+press[i][j]+press[i-1][j]+press[i][j-1]+press[i][j+1])%2; //构造前5行press数组
}
}
for(int j=1;j<=6;j++)
{
if(puzzle[5][j]!= (press[5][j]+press[5][j-1]+press[5][j+1]+press[4][j])%2) //判断最后一行的press状态是否可以使最后一行的灯全部熄灭
return 0;
}
return 1;
}
int main()
{
int i,j;
for(i=0;i<6;i++)
press[i][0]=press[i][7]=0;
for(i=1;i<=6;i++)
press[0][i]=0;
for(i=1;i<=5;i++)
{
for(j=1;j<=6;j++)
{
scanf("%d",&puzzle[i][j]);
}
}
for(int a=0;a<2;a++)
for(int b=0;b<2;b++)
for(int c=0;c<2;c++)
for(int d=0;d<2;d++)
for(int e=0;e<2;e++)
for(int f=0;f<2;f++) //枚举出第一行所有情况
{
press[1][1]=a;
press[1][2]=b;
press[1][3]=c;
press[1][4]=d;
press[1][5]=e;
press[1][6]=f;
if(check())
{
printf("\n");
for(i=1;i<=5;i++)
{
for(j=1;j<=6;j++)
printf("%d ",press[i][j]);
printf("\n");
}
return 0;
}
}
return 0;
}