有一个游戏,有21根火柴,你和计算机依次取(你优先),每次只可取走1〜4根,不能多取,也不能不取,谁取到最后一根火柴谁输。但是,最后发现,赢的总是计算机,请问为什么?
思路:
既然计算机每次都赢,根据上面的描述,咱们转换下思维,很明显,最后一根火柴必须是人来取走的。
我们进一步可以得出更为简单的结论,人和机器每次取,在一定的次数下,共同达到20,这样,计算机每次就可以赢了。
我们这里用people代替人每次选择的抽取数,comuputer代替计算机抽取数,spare代替总抽取数,所以,人每次选择后,计算机就要判断人的选择后做判断,即:computer = 5 - people;
spare = spare - computer;
//每一次循环人和计算机总抽取数统计剩余
因此完整代码如下:
#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");
continue;
}
else {
spare = spare - people;
}
if (spare == 0)
{
printf("computer win");
break;
}
computer = 5 - people;
spare = spare - computer;
printf("Computer:%d \n", computer);
if (spare == 0)
{
printf("\nPeople win! Game Over!\n");
break;
}
}
return 0;
}
运行验证看看:
即我们的思路正确。
对了,悄悄说一句,你甚至可以在我们的代码里找不到判断人胜利打印输出的逻辑,没错,机器始终胜利的(哈哈)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。