C语言解决常胜将军问题
問題描述:
有21張紙牌,兩個人依次取,每次每人只可以取走1~4張,不能多取,也不能不取,誰取到最后一張誰輸。編寫一個人機(jī)對弈程序,要求人先取,計(jì)算機(jī)后取;結(jié)果計(jì)算機(jī)為“常勝將軍”。
問題分析:
這樣思考這個問題,要想讓計(jì)算機(jī)是“常勝將軍”,也就是要然取到最后1張紙牌。這樣只有一種可能,就是讓計(jì)算機(jī)只剩1張紙牌給人,因?yàn)榇藭r人至少取1張紙牌。其他的情況都不能保證計(jì)算機(jī)常勝。
于是,問題轉(zhuǎn)化為“有20張紙牌,兩人輪流取,每人每次可以取走1~4張,不可多取,也不能不取,要求人先取,計(jì)算機(jī)后取,誰取到最后一張紙牌誰贏”。為了計(jì)算機(jī)能夠取到最后一張紙牌,就要保證最后一輪抽取(人先取一次,計(jì)算機(jī)再取一次)之前剩下5根火柴。因?yàn)橹挥羞@樣才能保證無論人怎樣取火柴,計(jì)算機(jī)能將其余的火柴全部取走。
于是,問題又轉(zhuǎn)化為“15張紙牌,兩人輪流取,每人每次可以取走1~4張,不可多取,也不能不取,要求人先取,計(jì)算機(jī)后取,保證計(jì)算機(jī)取到最后一張紙牌”。同樣的道理,為了讓計(jì)算機(jī)取到最后一張紙牌,就要保證最后一輪的抽取(人先取一次,計(jì)算機(jī)再取一次)之前剩下五根火柴。
于是,問題又轉(zhuǎn)化為10張紙牌的問題...,依次類推。
算法設(shè)計(jì):
根據(jù)以上分析,可以得出這樣的結(jié)論:21根紙牌,在人先取計(jì)算機(jī)后取。每次取1~4張的前提下,只要保證每一輪的抽取(人先抽取一次,計(jì)算機(jī)再取一次)時,人抽到的紙牌數(shù)與計(jì)算機(jī)抽到的紙牌數(shù)之和為5,就可以實(shí)現(xiàn)計(jì)算機(jī)的常勝不敗。
完整代碼如下:
#include <stdio.h>int main() {int computer,people,spare = 21;printf("---------------------------------\n");printf("--------快樂碼呀 www.happymaya.cn---------\n");printf("--------你不能戰(zhàn)勝我,不信試試---------\n");printf("---------------------------------\n\n");printf("Game begin:\n\n");int flag = 1;while(flag){printf("--------目前還有紙牌%d張---------\n",spare);printf("People:");scanf("%d",&people);if(people<1 || people>4 || people>spare){printf("你違規(guī)了,你取得紙牌數(shù)量有問題!\n\n");continue;}spare = spare - people;if(spare == 0) {printf("\nComputer win! Game Over!\n");break;}computer = 5- people;spare = spare - computer;printf("Computer:%d \n",computer);if(spare == 0){printf("\nPeople win! Game Over!\n");break;}}return 0; }運(yùn)行結(jié)果,如下圖:
待續(xù)......
若有不足,請大家多多指教!
總結(jié)
以上是生活随笔為你收集整理的C语言解决常胜将军问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 基于茅台股票的数据分析 相关性图 热力图
- 下一篇: 数据库(壹)
