2025年4月14日 星期一 乙巳(蛇)年 正月十五 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言常胜将军问题

时间:12-29来源:作者:点击数:91

问题描述

有21根火柴,两人依次取,每次每人只可取走1〜4根,不能多取,也不能不取,谁取到最后一根火柴谁输。请编写一个人机对弈程序,要求人先取,计算机后取;计算机为“常胜将军”。

问题分析

可以这样思考这个问题:要想让计算机是“常胜将军”,也就是要让人取到最后一根火柴。这样只有一种可能,那就是让计算机只剩下1根火柴给人,因为此时人至少取1根火柴。其他的情况都不能保证计算机常胜。

于是问题转化为“有20根火柴,两人轮流取,每人每次可以取走1〜4根,不可多取,也不能不取,要求人先取,计算机后取,谁取到最后一根火柴谁赢”。为了计算机能够取到最后一根火柴,就要保证最后一轮抽取(人先取一次,计算机再取一次)之前剩下5根火柴。因为只有这样才能保证无论人怎样取火柴,计算机都能将其余的火柴全部取走。

于是问题又转化为“15根火柴,两人轮流取,每人每次可以取走1〜4根,不可多取,也不能不取,要求人先取,计算机后取,保证计算机取到最后一根火柴”。同样道理,为了让计算机取到最后一根火柴,就要保证最后一轮的抽取(人先取一次,计算机再取一次)之前剩下5根火柴。

于是问题又转化为10根火柴的问题……,依次类推。

算法设计

根据以上分析,可以得出这样的结论:21根火柴,在人先取计算机后取。每次取1〜4根的前提下,只要保证每一轮的抽取(人先取一次,计算机再取一次)时,人抽到的火柴数与计算机抽到的火柴数之和为5,就可以实现计算机的常胜不败。

下面是完整的代码:

  • #include <stdio.h>
  • int main()
  • {
  • int computer, people, spare = 21;
  • printf(" -----------------------------------------\n");
  • printf(" -------- 你不能战胜我,不信试试 --------\n");
  • printf(" -----------------------------------------\n\n");
  • printf("Game begin:\n\n");
  • while(1)
  • {
  • printf(" ---------- 目前还有火柴 %d 根 ----------\n", spare);
  • printf("People:");
  • scanf("%d", &people);
  • if(people<1 || people>4 || people>spare)
  • {
  • printf("你违规了,你取的火柴数有问题!\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;
  • }

运行结果:

-----------------------------------------
 --------  你不能战胜我,不信试试  --------
-----------------------------------------

Game begin:

----------  目前还有火柴 21 根 ----------
People:1
Computer:4 
----------  目前还有火柴 16 根 ----------
People:3
Computer:2 
----------  目前还有火柴 11 根 ----------
People:2
Computer:3 
----------  目前还有火柴 6 根 ----------
People:4
Computer:1 
----------  目前还有火柴 1 根 ----------
People:1

Computer win! Game Over!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门