枚举-熄灯问题
问题讲解:
#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; }