枚举-熄灯问题

枚举-熄灯问题

问题讲解:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

#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;
	
} 

猜你喜欢

转载自blog.csdn.net/qq_40816078/article/details/79937028