C語言解決常勝將軍問題程式碼解析
問題描述
有21根火柴,兩人依次取,每次每人只可取走1〜4根,不能多取,也不能不取,誰取到最後一根火柴誰輸。請編寫一個人機對弈程式,要求人先取,計算機後取;計算機為“常勝將軍”。
問題分析
可以這樣思考這個問題:要想讓計算機是“常勝將軍”,也就是要讓人取到最後一根火柴。這樣只有一種可能,那就是讓計算機只剩下1根火柴給人,因為此時人至少取1根火柴。其他的情況都不能保證計算機常勝。
於是問題轉化為“有20根火柴,兩人輪流取,每人每次可以取走1〜4根,不可多取,也不能不取,要求人先取,計算機後取,誰取到最後一根火柴誰贏”。為了計算機能夠取到最後一根火柴,就要保證最後一輪抽取(人先取一次,計算機再取一次)之前剩下5根火柴。因為只有這樣才能保證無論人怎樣取火柴,計算機都能將其餘的火柴全部取走。
於是問題又轉化為“15根火柴,兩人輪流取,每人每次可以取走1〜4根,不可多取,也不能不取,要求人先取,計算機後取,保證計算機取到最後一根火柴”。同樣道理,為了讓計算機取到最後一根火柴,就要保證最後一輪的抽取(人先取一次,計算機再取一次)之前剩下5根火柴。
於是問題又轉化為10根火柴的問題……,依次類推。
演算法設計
根據以上分析,可以得出這樣的結論:21根火柴,在人先取計算機後取。每次取1〜4根的前提下,只要保證每一輪的抽取(人先取一次,計算機再取一次)時,人抽到的火柴數與計算機抽到的火柴數之和為5,就可以實現計算機的常勝不敗。
下面是完整的C語言程式碼:
執行結果:
Game begin:
---------- 目前還有火柴 21 根 ----------
People:1
Computer:4
---------- 目前還有火柴 16 根 ----------
People:4
Computer:1
---------- 目前還有火柴 11 根 ----------
People:3
Computer:2
---------- 目前還有火柴 6 根 ----------
People:1
Computer:4
---------- 目前還有火柴 1 根 ----------
People:1
Computer win! Game Over!