石子游戏,棋盘游戏(python)

文章目录

  • 石子游戏
    • 分析
    • 运行代码
      • 超时截图(对python极度不友好)
  • 棋盘游戏
    • 分析
    • 运行代码
      • 通过截图

石子游戏

题目描述
两人玩游戏,游戏内容为下:

有 n 个石头,两人每次可以从这 n 个石头中取 p^k个(p 是任意质数,k 是任意自然数,p^k要求不大于当前剩余石头数),谁能取走最后石头,谁就获胜了。

问先手取石头的人,有没有必胜的策略。如果先手有,则输出 first,否则输出 second。

输入描述
输入第一行包含一个正整数 T,表示测试数量。

接下来后面 T 行,每行包含一个正整数 n,表示石头个数。

1≤T≤10^5,1≤n≤10^6


输出描述
输出共 T 行,每行分别为 first 或 second。

输入输出样例
示例
输入

3
3
6
9

输出

first
second
first

运行限制
最大运行时间:1s
最大运行内存: 256M

分析

  • 巴什博奕(寻找重要转折点)

  • n = 1 ,2^0 = 1,先手胜
    n = 2 ,2^1 = 2,先手胜
    n = 3 ,3^1 = 3,先手胜
    n = 4 ,2^2 = 4,先手胜
    n = 5 ,5^1 = 5,先手胜
    n = 6 ,无法一次拿全部,后手胜

  • 假设6是关键节点,假设n是一个正整数,那么6n必定不等于p^k

  • 因为2以外的质数都是奇数,奇数的k次方必定是奇数,而6n是偶数,所以不等于。而2的k次方没有因子3,所以6n无法等于p^k。

  • 也就是说开始是6的倍数,后手必胜。当是6的倍数时,先手无论怎么拿,后手只要拿1—5凑到6的倍数即可。后手必定是拿最后一堆。

运行代码

T=int(input())
while T>0:
    n=int(input())
    if n%6 :
        print("first")
    else:
        print("second")
    T-=1

超时截图(对python极度不友好)

石子游戏,棋盘游戏(python)_第1张图片

棋盘游戏

题目描述
给定一个 n×n 的棋盘,一个石头被放在棋盘的左上角。

Alice 和 Bob 轮流移动石头。每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。

谁不能移动石头了就算输。假如 Alice 先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?

输入描述
输入文件有多组数据。

输入第一行包含一个整数 n,表示棋盘的规模。

当输入n为 0 时,表示输入结束。

输出描述
对于每组数据,如果 Alice 最后能赢,则输出 Alice, 否则输出 Bob。

每一组答案独占一行。

1≤n≤10^4


输入输出样例
示例
输入

3
6
9
0

输出

Bob
Alice
Bob

运行限制
最大运行时间:1s
最大运行内存: 256M

分析

  • 巴什博奕(我没看出来),明天准备问老师。搞懂再分析

运行代码

while(1):
  n = int(input())
  if n == 0:
    break
  if n%2:
    print("Bob")
  else:
    print("Alice")

通过截图

石子游戏,棋盘游戏(python)_第2张图片

如有错误,敬请指正,欢迎交流,谢谢♪(・ω・)ノ

你可能感兴趣的:(#,Game,Theory,python,蓝桥杯,算法)