今天看到群里讨论关于灯泡的问题,就使用java简单实现了一下,不是最优的算法,欢迎大家指正。
一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡的状态随机,按一个灯泡,相邻的两个灯泡的状态也发生一次变化。比如 暗-亮-暗,按中间灯泡,变化为 亮-暗-亮。问,设计一道算法,使得所有灯泡最后都亮。
具体代码如下:
/**
* 对灯泡进行调整
* @param arr 以长度为100的数组模拟环形灯泡链,1标识亮,0标识暗
*/
public static void dengpao(int[] arr){
while (sum(arr)) {
dotemp(arr);
}
}
/**
* 计数,判断灯泡是否全部亮了
* @param arr
* @return
*/
public static boolean sum(int[] arr) {
int sum = 0;
for (int i : arr) {
sum = sum + i;
}
return sum != 100;
}
/**
* 遍历一遍灯泡链,遇到0则进行调整操作,三个一组调整
* @param arr
*/
public static void dotemp(int[] arr) {
for (int i = 0; i < 100; i++) {
if (arr[(i + 1) % 100] == 0) {
int t1 = arr[i] << 2;
int t2 = arr[(i + 1) % 100] << 1;
int t3 = arr[(i + 2) % 100];
int tmp = t1 + t2 + t3;
doCheck(tmp, arr, i);
}
}
}
/**
* 调整灯泡
* @param flag
* @param arr
* @param ii
*/
public static void doCheck(int flag, int[] arr, int ii) {
switch (flag) {
case 0:
// 000
arr[ii] = 1;
arr[(ii + 1) % 100] = 1;
arr[(ii + 2) % 100] = 1;
break;
case 4:
// 100
arr[(ii + 1) % 100] = 1;
arr[(ii + 2) % 100] = 1;
arr[(ii + 3) % 100] = (arr[(ii + 3) % 100] == 1 ? 0 : 1);
break;
case 5:
// 101
arr[ii] = 0;
arr[(ii + 1) % 100] = 1;
arr[(ii + 2) % 100] = 0;
break;
default:
break;
}
}
具体调用操作的代码如下:
public static void main(String[] args) {
int[] arr = new int[100];
Random ra = new Random();
for (int j = 0; j < 100; j++) {
arr[j] = (ra.nextInt() % 2 == 0 ? 0 : 1);
}
System.out.print("构造数组:");
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println("\n--------------------------------");
//调用程序
dengpao(arr);
System.out.print("结果数组:");
for (int j : arr) {
System.out.print(j + " ");
}
}
具体执行结果如下:
有更好办法,欢迎大家交流。