C语言解决常胜将军问题代码解析
有21根火柴,两人依次取,每次每人只可取走1〜4根,不能多取,也不能不取,谁取到最后一根火柴谁输。请编写一个人机对弈程序,要求人先取,计算机后取;计算机为“常胜将军”。
问题分析
可以这样思考这个问题:要想让计算机是“常胜将军”,也就是要让人取到最后一根火柴。这样只有一种可能,那就是让计算机只剩下1根火柴给人,因为此时人至少取1根火柴。其他的情况都不能保证计算机常胜。
于是问题转化为“有20根火柴,两人轮流取,每人每次可以取走1〜4根,不可多取,也不能不取,要求人先取,计算机后取,谁取到最后一根火柴谁赢”。为了计算机能够取到最后一根火柴,就要保证最后一轮抽取(人先取一次,计算机再取一次)之前剩下5根火柴。因为只有这样才能保证无论人怎样取火柴,计算机都能将其余的火柴全部取走。
于是问题又转化为“15根火柴,两人轮流取,每人每次可以取走1〜4根,不可多取,也不能不取,要求人先取,计算机后取,保证计算机取到最后一根火柴”。同样道理,为了让计算机取到最后一根火柴,就要保证最后一轮的抽取(人先取一次,计算机再取一次)之前剩下5根火柴。
于是问题又转化为10根火柴的问题……,依次类推。
算法设计
根据以上分析,可以得出这样的结论:21根火柴,在人先取计算机后取。每次取1〜4根的前提下,只要保证每一轮的抽取(人先取一次,计算机再取一次)时,人抽到的火柴数与计算机抽到的火柴数之和为5,就可以实现计算机的常胜不败。
下面是完整的C语言代码:
#include <stdio.h>
int main()
{
int computer, people, spare = 21;
printf(" -----------------------------------------\n");
printf(" -------- Linux公社 www.linuxidc.com --------\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;
}
运行结果:
-----------------------------------------
-------- Linux公社 www.linuxidc.com --------
-------- 你不能战胜我,不信试试 --------
-----------------------------------------
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!
- [解决问题]apache2安装以后无法解析php代码
- 利用简洁的C语言代码解决跳台阶问题与约瑟夫环问题
- C语言解决螺旋矩阵算法问题的代码示例_C 语言
- 解决 html 代码不解析 的问题
- 设置SourceInsight的condition解决代码语法解析错误的问题
- 从后台action传过来的字符串不能被解析html代码 解决办法和struts2 里escape="false"的问题
- C语言编程狼追兔子问题代码解析
- 在Markdown中紧跟list列表后的四空格缩进代码被错误解析问题与解决方法
- C语言解决螺旋矩阵算法问题的代码示例
- vs2015中编写C语言代码出现错误:提示scanf is not safe 问题解决办法
- 一步解决IE8兼容问题:让IE8以IE7/IE6模式解析你的网页代码
- 晚上终于解决了我的代码中history与浏览器缓存问题!
- 解决Js内存泄漏问题的代码片断
- Listview控件相关问题以及解决代码之二
- 怎样在Sharepoint webpart中写 Repeat 、datalist 、datagrid ,读懂这段代码应该可以解决这类问题了
- 解决问题记录(2)-Oracle提示“无法解析指定的标示符”
- FootStep 8、VC6下进行Symbian开发时,非代码问题引起的编译及链接出错的解决方法
- 一些常见的问题与解决代码!(三)(JS)
- 图片左右循环连续滚动代码,解决marquee的留白问题
- 一些常见的问题与解决代码!(精典) 2