日期:2026年4月6日
ZeroJudge 題目連結:d088. 00127 - "Accordian" Patience
解題想法
這題的測資格式比較特別,如果用 Python 解題,最好用 sys.stdin.read().split() 一次讀取所有的測資,再用索引值分割,這樣會比較方便。儲存所有牌堆資料時,用可以改變長度、刪除資料的 list 及 vector 比較方便。用 while 迴圈檢查是否有可以合併的牌堆,直到沒有可以合併的牌堆為止。
Python 程式碼
使用時間約為 10 ms,記憶體約為 8.6 MB,通過測試。
def solve():
import sys
result = []
data = sys.stdin.read().split()
ptr = 0
while ptr < len(data):
# 停止條件
if data[ptr] == "#": break
# 讀取兩行測資組成牌堆
piles = [[card] for card in data[ptr:ptr+52]]
ptr += 52
# 移動過程
changed = True # 是否有交換牌
while changed: # 如果有交換繼續執行
changed = False # 先設定為 False
i = 1 # 從牌堆 1 開始檢查
while i < len(piles): # 如果 i 還沒有出界繼續執行
# 先檢查牌堆 i 與 i-3 最上面的牌是否同花色或同數字
if i >= 3 and (piles[i][-1][0] == piles[i-3][-1][0] or \
piles[i][-1][1] == piles[i-3][-1][1]):
piles[i-3].append(piles[i].pop()) # 牌堆 i 最上面移到牌堆 i-3
if not piles[i]: del piles[i] # 如果牌堆 i 是空的,刪除
changed = True # 有交換牌
break # 中止迴圈
# 檢查牌堆 i 與 i-1 最上面的牌是否同花色或同數字
elif i >= 1 and (piles[i][-1][0] == piles[i-1][-1][0] or \
piles[i][-1][1] == piles[i-1][-1][1]):
piles[i-1].append(piles[i].pop()) # 牌堆 i 最上面移到牌堆 i-1
if not piles[i]: del piles[i] # 如果牌堆 i 是空的,刪除
changed = True # 有交換牌
break # 中止迴圈
# 牌堆 i 不能交換,檢查下一張
i += 1
# 組合答案
n = len(piles) # 牌堆數量
nums = [len(pile) for pile in piles] # 各牌堆張數
if n == 1: # 只有一堆
result.append(f"1 pile remaining: {nums[0]:d}\n")
else: # 不只一堆
result.append(f"{n:d} piles remaining: " + " ".join(map(str, nums)) + "\n")
# 輸出答案
sys.stdout.write("".join(result))
if __name__ == "__main__":
solve()