算法学习day19----博弈论模型--取石子游戏(Python)

一道威佐夫博弈题,来自杭电oj
具体思路见文章链接,写的非常好,🌰举的很完善
这里提供python改写与优化代码供大家参考,原博弈模型用到黄金分割这一浮点数并进行向下取整
为避免浮点数精度问题,使用整数运算验证奇异局势:
对于两堆石子(a, b),其中 a ≤ b,计算 k = b - a。奇异局势满足:
-
a = floor(k * (1 + √5) / 2)
-
条件1:当 2a ≥ k 时,检查 (2a - k)² ≤ 5k²
-
条件2:当 2(a + 1) > k 时,检查 5k² < (2a + 2 - k)²
-
同时满足这两个条件则为奇异局势,先手必败(输出0);否则先手必胜(输出1)。
def main():import sysdata = sys.stdin.read().split()if not data:returnresults = []for i in range(0, len(data), 2):a = int(data[i])b = int(data[i+1])if a > b:a, b = b, ak = b - a# 处理特殊情况:两堆都为0if a == 0 and k == 0:results.append("0")# 处理特殊情况:两堆相等且非零elif k == 0:results.append("1")else:# 合并两个条件为单一判断if (2*a - k)**2 <= 5*k*k < (2*a + 2 - k)**2:results.append("0")else:results.append("1")for res in results:print(res)if __name__ == "__main__":main()
