用c++实现,,,下面是题目。 ⼀*AB两个人玩一个取石子游戏,一共有n (n>=2)个石子,要

2025-05-14 05:51:14
推荐回答(1个)
回答1:

现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”。

*问题分析与算法设计
在计算机后手的情况下,要想使计算机成为“常胜将军”,必须找出取关键。根据本题的要求可以总结出,后取一方的火柴数量与对方刚才一步取火柴的数量之和等于5,就可以保证最后一根火柴是留给先手的那个人的。
采用逆推法。数字表示此轮取火柴时,所剩下的火柴数。
输家 赢家
第5轮 1 2,3,4,5
第4轮 6 7,8,9,10
第3轮 11 12,13,14,15
第2轮 16 17,18,19,20
第1轮 21
只要对方不出错,谁碰到21,16,11,6,1,谁就输定了。所以,只要让计算机后手,再采取正确的方式,就能成为“常胜将军”。

据此分析进行算法设计就是很简单的工作,编程实现也十分容易。

*程序说明与注释
#include

void main()
{
int a=21,i;
printf("Game starts:\n");
while(a>0)
{
do
{
printf("How many sticks do you wish to take(1~%d)?",a>4?4:a);
scanf("%d",&i);
}while(i>4||i<1||i>a); //接收正确的输入
if(a-i>0)
{
printf(a-i>1?"%d sticks left in the pile.\n":"%d stick left in the pile.\n",a-i);
}
if((a-i)==0)
{
printf("You have taken the last stick.\n");
printf(" * * * * * * You lose! * * * * * * \nGame Over.\n"); //输出取胜标记
break;
}
else
{
printf(5-i>1?"Compute takes %d sticks.\n":"Compute takes %d stick.\n",5-i); //输出计算机取的数目
}
a-=5;
printf("%d stick left in the pile.\n",a);
}
}