[蓝桥杯][算法提高VIP]开灯游戏

[蓝桥杯][算法提高VIP]开灯游戏

时间限制: 1Sec 内存限制: 128MB 提交: 4 解决: 1

题目描述

有9盏灯与9个开关,编号都是1~9。 

每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的)。 

具体如下: 

第一个开关控制第二,第四盏灯; 

第二个开关控制第一,第三,第五盏灯; 

第三个开关控制第二,第六盏灯; 

第四个开关控制第一,第五,第七盏灯; 

第五个开关控制第二,第四,第六,第八盏灯; 

第六个开关控制第三,第五,第九盏灯; 

第七个开关控制第四,第八盏灯; 

第八个开关控制第五,第七,第九盏灯; 

第九个开关控制第六,第八盏灯。 

开始时所有灯都是熄灭的,开关是关闭着的。要求按下若干开关后,使得只有4盏灯亮着。 

输入

输出

输出所有可能的方案,每行一个方案,每一行有9个字符,从左往右第i个字符表示第i个开关的状态(" 0" 表示关闭," 1" 表示打开),按字典序输出。下面的样例输出只是部分方案。 

样例输入

样例输出

000001011 
000001110 
000001111 

解题思路:

   一定要读清楚题意, 搜索枚举所有的开关状态。

#include<iostream>
#include<cstring> 
#include<algorithm> 
using namespace std;
int   a[10],vis[10];
void  check( ){
	  for( int i=1;i<=9;i++){
	  	   if( vis[i] ){
	  	        if( i == 1 ){
	  	   	   	   a[2] = !a[2];
	  	   	   	   a[4] = !a[4];
			   }
			   else if( i == 2 ){
			   	   a[1] = !a[1];
				   a[3] = !a[3];
				   a[5] = !a[5];
			   }
			   else if( i == 3 ){
			   	   a[2] = !a[2];
			   	   a[6] = !a[6];
			   }
			   else if( i==4 ){
			   	   a[1] = !a[1];
			   	   a[5] = !a[5];
				   a[7] = !a[7]; 
			   }
			   else if( i==5 ){
			   	   a[2] = !a[2];
			   	   a[4] = !a[4];
			   	   a[6] = !a[6];
			   	   a[8] = !a[8];
			   }
			   else if( i==6 ){
			   	  a[3] = !a[3];
			   	  a[5] = !a[5];
			   	  a[9] = !a[9];
			   }
			   else if( i==7 ){
			   	   a[4] = !a[4];
			   	   a[8] = !a[8];
			   }
			   else if( i == 8 ){
			   	   a[5] = !a[5];
			   	   a[7] = !a[7];
			   	   a[9] = !a[9];
			   }
			   else if( i==9 ){
			   	   a[6] = !a[6];
			   	   a[8] = !a[8];
			   } 	
		   }
	  }
	   
	  int cnt =0;
      for( int i=1;i<=9;i++){
      	   if( a[i]   ){
      	       cnt++;	
		   }
	  }
	  if( cnt == 4 ){
	  	  for( int i=1;i<=9;i++){
	  	  	   printf("%d",vis[i]);
	  	  	}
		   printf("\n");
	   } 
}
void  dfs( int n  ){
	  if( n == 10 ){
	  	  check() ; 
	  	  memset(a,0,sizeof(a));
	      return ;
	  } 
	  for( int j=0;j<2;j++){ 
	  	       vis[n] = j;
	  	   	   dfs( n+1); 
	  } 	  
}
int   main(void){
	  memset(a,0,sizeof(a));
	  memset(vis,0,sizeof(vis));
	  dfs( 1 );
	  return 0;
}

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/94638692