1. 程式人生 > >C語言解決常勝將軍問題程式碼解析

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!

C語言解決常勝將軍問題程式碼解析