游戏以$n$便士开始,然后我可以随意将其分成两堆。 然后我们轮流轮流进行,你先轮流,直到有人赢了比赛。 在每一回合中,玩家可以从任意一堆硬币中取出任意数量的硬币,或者从两堆硬币中拿出相同数量的硬币。 每个玩家每回合必须至少拿一便士。 比赛的胜利者是最后一分钱的人。
如果我们都打得很好,那么什么样的开始数能保证你赢?
从第一堆中取出以获得$(0,2)$。 从第二堆中取出以获得$(1,1)$或$(1,0)$。 从两个桩中取出以获得$(0,1)$。
在一次移动中,从另一个安全位置到达安全位置是不可能的。 如果这是可能的,那么我们的对手可以移动到一个安全的位置,然后他们就会是安全的! 从任何不安全的位置,都可以一次移动到安全位置。 这是因为,如果我们从一个安全的位置开始,那么根据定义,每当再次轮到我们时,我们必须能够回到一个安全的位置。
将numpy导入为np N=51#将此更改为不同的点数 A=np。零((2*N,2*N),int) 对于范围(2*N)内的i: 对于范围(i+1)中的j: A[i-j,j]=~((A[:i-j,j]==1).any()| (A[i-j,:j]==1).any()| (np.diag(A[i-j-1::-1,j-1::-1])==1).any())
将matplotlib.pyplot作为plt导入 导入matplotlib.cm作为cm 图,ax=plt.子图(图=(9,9)) ax.imshow(A[:N,:N],origin='lower',interporation=None,cmap=cm.Blues) ax.set_sticks(范围(N),次要=真) ax.set_ytiks(范围(N),minor=True) ax.grid(其中='minor',color='lightgray') ax.grid(其中='major',color='dimgray') ax.图([0,20],[20,0],'r--') ax.图([0,30],[30,0],'r--') ax.set_xlabel(“第一堆硬币”) ax.set_ylabel(“第二堆硬币”) ax.set_title(“捏硬币的安全组合(威瑟夫的游戏)”)
将numpy导入为np φ=(1+np.sqrt(5))/2 np.数组([int(np.floor(n*phi)+np.flower(n*φ**2)),用于范围(1118)内的n)] #输出: 阵列([3、8、11、16、21、24、29、32、37、42、45、50、55、, 58, 63, 66, 71, 76, 79, 84, 87, 92, 97, 100, 105, 110, 113, 118, 121, 126, 131, 134, 139, 144, 147, 152, 155, 160, 165, 168, 173, 176, 181, 186, 189, 194, 199, 202, 207, 210, 215, 220, 223, 228, 231, 236, 241, 244, 249, 254, 257, 262, 265, 270, 275, 278, 283, 288, 291, 296, 299, 304, 309, 312, 317, 320, 325, 330, 333, 338, 343, 346, 351, 354, 359, 364, 367, 372, 377, 380, 385, 388、393、398、401、406、409、414、419、422、427、432、435、440, 443, 448, 453, 456, 461, 464, 469, 474, 477, 482, 487, 490, 495])