用Python求解这道奥数题

地上有四堆石子,石子数分别是1 9 15 31如果每次从其中的三堆同时各取出1个,然后都放入第四堆中,那么,能否经过若干次操作,使得这四堆石子的个数都相同? 如果能,输出操作步骤。

答案是不能。

img

这是我编辑的,但是不知道问题出在了哪里。求解答!!

剛剛寫了一篇回答, 用的是遞歸方法, 有點蠢了, 于是又重寫了个簡化的, 當然, 因爲太晚了, 難免有不當處, 拋磚引玉, 懽迎指正:

import pprint  # 輸出結果時, 格式更友好

stone_src = [1, 9, 15, 31]  # 原始石堆
stone_array = [sorted(stone_src)]  # 用以檢查重復的二維列表
move_record = [stone_src]  # 用以記錄步驟的二維列表

def move_stone(stone):
    """不能實現均分的條件是出現同樣的石頭堆數排列"""
    while True:
        stone_copy = stone.copy()

        # 修改各項值
        index_min = stone_copy.index(min(stone_copy))
        stone_copy[index_min] += 3
        for i in range(len(stone_copy)):
            if i != index_min:
                stone_copy[i] -= 1
        move_record.append(stone_copy)  # 添加到移動記錄列表

        # 檢查是否全等, 即解決問題
        if len(set(stone_copy)) == 1:
            return True
        else:
            # 檢查是否出現不可解條件
            if sorted(stone_copy) in stone_array:
                return False
            else:
                stone_array.append(sorted(stone_copy))
                stone = stone_copy

# 主流程
if sum(stone_src) % 4 == 0:  # 判斷是否能均分
    if move_stone(stone_src):
        pprint.pp(move_record)  # 如若解決, 則打印步驟
        print('----解題完成, 步驟如上!!!!')
    else:
        print('----不能按題目方法求解!!!!')
else:
    print('----數量不能均分!!!!')

已驗證, 如題的不能求解:

img

測試新的組合, [2, 14, 22, 22], 可求解, 並輸出步驟:

img