解题思路:


            数据存放:

            使用二维数组Switch来存放每个开关能控制的灯的编号,_Switch数组存放每个开关的开关状态,light数组存放每个灯的状态。


            算法思路:

            使用dfs,每次下探时决定当前开关是关闭还是开启,即_Switch数组当前位是'0'还是'1',每当排好一种就检查这个开关序列是否合乎要求,即这样操作后是否只有四个灯亮。



注意事项:   


            1、light[Switch[i][j] - 1] = 0;  此处的减一不能忘了。

            2、Arrays.fill(light, 0);  这一步也很重要,每次检查完要将其初始化。



参考代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	
	public static int[][] Switch = new int[][] {	//存储每个开关能控制的灯的编号
		{2,4},
		{1,3,5},
		{2,6},
		{1,5,7},
		{2,4,6,8},
		{3,5,9},
		{4,8},
		{5,7,9},
		{6,8}
	};
	public static int[] light = {0,0,0,0,0,0,0,0,0};	//灯的状态
	
	public static void dfs(char[] _Switch, int cur) {
		//考虑好了一种开关序列,检查是否合乎要求(即操作后是否只有四个灯亮)
		if(cur == 9)
		{
			if(check(_Switch))
			{
				System.out.println(String.valueOf(_Switch));
			}
			return;
		}
		
		//不开
		_Switch[cur] = '0';
		dfs(_Switch, cur + 1);
		
		//开
		_Switch[cur] = '1';
		dfs(_Switch, cur + 1);
	}
	
	public static boolean check(char[] _Switch) {    //操作后是否只有四个灯亮
		int sum = 0;
		for(int i = 0; i < 9; i++)
		{
			if(_Switch[i] == '1')
			{
				for(int j = 0; j < Switch[i].length; j++)
				{
					if(light[Switch[i][j] - 1] == 1)
					{
						light[Switch[i][j] - 1] = 0;
						//从关变成了开,所以开着的灯+1
						sum--;
					}
					else
					{
						light[Switch[i][j] - 1] = 1;
						//从开变成了关,所以开着的灯-1
						sum++;
					}
				}
			}
		}
		Arrays.fill(light, 0);
		return sum == 4;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		char[] _Switch = "000000000".toCharArray();	//开关的状态
		dfs(_Switch, 0);
		
		in.close();
	}
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论