问题描述
取球博弈
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7,8。
轮到某一方取球时不能弃权!
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
程序运行时,从标准输入获得数据,其格式如下:
先是一个整数n(n<100),表示接下来有n个整数。然后是n个整数,每个占一行(整数<10000),表示初始球数。
程序则输出n行,表示A的输赢情况(输为0,赢为1)。
例如,用户输入:
4
1
2
10
18
则程序应该输出:
0
1
1
0
解决方案
注意‘两人都很聪明,不会做出错误的判断’这段话。
意思是当A和B面临选择时,如果他们的选择能使对方输(不管对方怎么选择,结果都是输),那么他们就一定会这样选择。
所以,这可能就是一个找规律的题型,在一定范围内具有某种规律,之后不停地重复这种规律。因为球数多了 A先选就会把情况变成之前的某一种情况。
我们试一试:
次数输赢(输 0 赢 1)
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 1
9 1
10 1
11 1
12 1
13 1
14 1
15 1
16 0
17 1
18 0
19 1
不难看出这是以15为一个循环的,1到8是输赢交替,9到15都是赢。接下来写代码便容易了很多。
编写代码:
n = int(input('多少个开始球数的情况:'))
l = list(i for i in range(n))
for i in range(n):
l[i] = int(input())
def qiuqiu(m):
mm = m % 15
if mm > 7: print(1)
else:
if mm % 2 == 0: print(1)
else: print(0)
for i in l:
qiuqiu(i
END
实习编辑 | 王文星
责 编 | 周茂林
where2go 团队