试题 算法提高 开灯游戏
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有9盏灯与9个开关,编号都是1~9。
每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的)。
具体如下:
第一个开关控制第二,第四盏灯;
第二个开关控制第一,第三,第五盏灯;
第三个开关控制第二,第六盏灯;
第四个开关控制第一,第五,第七盏灯;
第五个开关控制第二,第四,第六,第八盏灯;
第六个开关控制第三,第五,第九盏灯;
第七个开关控制第四,第八盏灯;
第八个开关控制第五,第七,第九盏灯;
第九个开关控制第六,第八盏灯。
开始时所有灯都是熄灭的,开关是关闭着的。要求按下若干开关后,使得只有4盏灯亮着。
输出格式
输出所有可能的方案,每行一个方案,每一行有9个字符,从左往右第i个字符表示第i个开关的状态("0"表示关闭,"1"表示打开),
按字典序输出。下面的样例输出只是部分方案。
样例输出
import java.util.*;
public class _开灯游戏 {
static ArrayList<Integer>[] aLists= new ArrayList[9];
public static void main(String[] args) {
setArrylist(aLists);
gcd("");
}
private static void gcd(String str) {
if(str.length()==9) {
getString(str);
// System.out.println(str);
return;
}
gcd(str+"0");
gcd(str+"1");
}
private static void getString(String str) {
int num[] = new int[9];
for (int i = 0; i < num.length; i++) {
if(str.charAt(i)=='0')continue;
ArrayList<Integer> array = aLists[i];
for (int j= 0; j <array.size(); j++) {
if(num[array.get(j)-1]==1)num[array.get(j)-1]=0;
else num[array.get(j)-1]=1;
}
}
sheck(num, str);
}
private static void sheck(int[] num,String str) {
int k=0;
for (int i = 0; i < num.length; i++) {
if(num[i]==1)k++;
}
if(k==4)System.out.println(str);
return;
}
public static void setArrylist(ArrayList[] alists) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(2);list1.add(4);
alists[0]=list1;
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(1);list2.add(3);list2.add(5);
alists[1]=list2;
ArrayList<Integer> list3 = new ArrayList<Integer>();
list3.add(2);list3.add(6);
alists[2]=list3;
ArrayList<Integer> list4 = new ArrayList<Integer>();
list4.add(1);list4.add(5);list4.add(7);
alists[3]=list4;
ArrayList<Integer> list5 = new ArrayList<Integer>();
list5.add(2);list5.add(4);list5.add(6);list5.add(8);
alists[4]=list5;
ArrayList<Integer> list6 = new ArrayList<Integer>();
list6.add(3);list6.add(5);list6.add(9);
alists[5]=list6;
ArrayList<Integer> list7 = new ArrayList<Integer>();
list7.add(4);list7.add(8);
alists[6]=list7;
ArrayList<Integer> list8 = new ArrayList<Integer>();
list8.add(5);list8.add(7);list8.add(9);
alists[7]=list8;
ArrayList<Integer> list9 = new ArrayList<Integer>();
list9.add(6);list9.add(8);
alists[8]=list9;
}
}