首页 > 试题广场 >

关灯游戏

[编程题]关灯游戏
  • 热度指数:1487 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
在 Alice 生日的那天, Bob 送给了她 n 个灯泡。他们决定用这些灯泡玩一个游戏:他们把这些灯泡从左往右排成一行,在初始时,有些灯泡是点亮的,有些灯泡是熄灭的。接下来,他们轮流进行操作,Alice 首先操作。在每一次操作中,轮到操作的人需要选择一个点亮的灯泡,然后把它以及它右边的所有灯泡的状态进行一次改变,即把点亮的灯泡熄灭,把熄灭的灯泡点亮。如果在某一个人操作完之后,所有的灯泡都变成了熄灭状态,那么那个人就赢得了游戏。 Alice 和 Bob 都想赢得游戏,在他们都足够聪明的情况下,最后谁会赢呢?

数据范围: , 输入只包含 0 和 1

输入描述:
第一行包含一个整数 ,表示灯泡的个数。

第二行包含 个 0 或 1,表示初始时灯泡的状态,0 表示熄灭,1 表示点亮。



输出描述:
如果最后Alice能赢,输出Alice,或则输出Bob。
示例1

输入

3
0 1 1

输出

Alice
示例2

输入

5
1 1 1 0 0

输出

Bob
import java.util.Scanner;
public class Main{
    public String game(int n,int[] light){
        int turnNum=0;   //换灯泡次数
        //关灯游戏可理解为,将相邻连续的几盏状态相同的灯视为同一盏(因为进行操作时状态同步变化)
        //如存在10盏灯:0 0 1 0 0 1 1 1 0 1  ,合并连续的相同状态的灯后,可视为:0 1 0 1 0 1
        //再去掉最左边已熄灭的灯,可视为:1 0 1 0 1,剩余数字数量为5,则需要进行5次操作可赢得游戏
        int val=0;       
        for(int i=0;i<n;i++) {
        	if(light[i]!=val) {
        		turnNum++;
        		val=light[i];
        	}
        }
        if(turnNum%2==1) {
        	return "Alice";  //换奇数次为Alice赢
        }
        else {
        	return "Bob";   //**数次为Bob赢
        }
    }
    //main方法
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();  // n为灯泡数量
        int[] a=new int[n];  //根据灯泡数量创建对应长度的数组,如 5
        for(int i=0;i<n;i++){ //循环将键盘输入的整数存入数组,如 1 0 0 1 1
            a[i]=sc.nextInt();
        }
        System.out.println(new Main().game(n,a));
    }
}

编辑于 2020-09-10 04:14:55 回复(0)