在网上看到一道题
首先我们可以随便手写(或者编程)看看最后结果可能是什么,结果发现最后全部都是黑子,不妨猜想,会不会无论起始状态如何,都会有相同的结果。
一看到就想要暴力枚举了,由题目,一共有8个棋子,每一个都只有黑白两种,那么就可以把它们设成零和一,然后用二进制转换把从1到128(2^8)的所有数转化为二进制,再补齐为八位,就可以不重不漏地找出所有可能。
def spiltbin(a):
bin_num = '{0:b}'.format(a)#把a转化为二进制数
complete_num = bin_num.zfill(8)#补齐为八位
spilt_num = []#分成一个列表 给下面用
for i in complete_num:
spilt_num.append(i)
return spilt_num
然后用递归的方法,看看能不能跑出来,其实这里有一个问题,如果递归结果跑不出来怎么办,作者亲测,会溢出的。
#黑子设为一
#白子设为0
def conduct(numlist,n):
new_numlist = []
if numlist == ['1', '1', '1', '1', '1', '1', '1', '1']:
print(True)#递归结束条件
return numlist
for i in range(0, 7):#一个指针
j = i + 1#相邻比较
if numlist[i] == numlist[j]:
new_numlist.append('1')
elif numlist[i] != numlist[j]:
new_numlist.append('0')
if numlist[0] == numlist[7]:#头尾比较
new_numlist.append('1')
elif numlist[0] != numlist[7]:
new_numlist.append('0')
conduct(new_numlist,n)#递归
然后再用for跑128趟就好了,结果确实是全部都是黑子
但是,这样太蠢了
看书上给了一种数学直接证明的方法:
因为有黑+白=白 白+黑=白
黑+黑=黑 白+白=黑
即棋子同黑异白,这不就和正负数乘法同正异负同构吗?(不严谨)
不妨设黑为+1,白为-1,而求出他们之间的数的推演过程则用乘法表示
最后直接来一个杨辉三角,中间的幂次全部都是偶数,所以一定为正,左右相等,同正,所以结果一定为正,顺便还证明了最多不超过8步。
所以最后一定为全部黑。
还是人脑比较好用啊!!