求C语言取石子游戏的思路 请详细点

求C语言取石子游戏的思路 请详细点,第1张

#include <stdioh>

int main ()

{

int a,b,c;

const double d=16180339887498948482045 ;

while(scanf("%d%d",&a,&b)!=EOF){

if (a==b) {printf("1\n"); continue;}

if (a>b) {c=a-b;a=b;}

else c=b-a;

if (a==(int)(cd))

printf("0\n");

else printf("1\n");

}

return 0;

}

先手 取1个 剩57

然后对方如果取1个 你取3个

对方取2个 你取2个

对方取3个 你取1个

保持每回合总数为4个

14回合过后 4×14=56 石子剩1个

然后到对手取 你赢了

这道题不可能先后手都赢

你想 你先手绝对能赢对方

对方先手也绝对能赢你

最后只要两个盘子剩下的石子相同(大于1),或三个盘子剩下的都是1个,对方必败。1)乙从C盘取走1个,此后,甲取1乙取1,或甲取2乙取2,最后甲取2乙取1,或甲取1乙取2,乙胜。2)甲从B盘取走2个,这样,三个盘子分别还有3、2、1个。此后,乙取A中的1个时,甲取C中最后1个。或乙取A中的2个时,甲取B中的1个。若乙取B中的1个,甲取A中的2个。或乙取C中的最后1个,甲取A中的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 <stdioh>

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>44: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);

}

}

这种博奕游戏一般假设双方都是同样聪明的 ,所以根据石子总数不同游戏结果有两种:

1)如果石子总数为4n+1的话,先取的人必输。

后取的人的策略是,每次取的石子数总与先取的人所取数目总和为4,这样石子总数总是4个4个往下减,直到最后剩下1个,被先取的人取走从而使其输掉游戏。

2)如果石子总数为上述情况以外的4n+2,4n+3,4n这三种情况中的任一种,那么先取的人必赢。

其策略是,第一轮取掉若干(对应上述三种情况分别取掉1,2,3个)石子,使剩下的石子总数是4n+1,从而使后取的人面临第一种必输情况即可。

算法训练 石子 游戏

问题描述

石子 游戏 的规则如下:

地上有n堆石子,每次 *** 作可选取两堆石子(石子个数分别为x和y)并将它们合并, *** 作的得分记为(x+1) (y+1),对地上的石子堆进行 *** 作直到只剩下一堆石子时停止 游戏 。

请问在整个 游戏 过程中 *** 作的总得分的最大值是多少?

输入格式

输入数据的第一行为整数n,表示地上的石子堆数;第二行至第n+1行是每堆石子的个数。

输出格式

程序输出一行,为 游戏 总得分的最大值。

样例输入

10

5105

19400

27309

19892

27814

25129

19272

12517

25419

4053

样例输出

15212676150

数据规模和约定

1 n 1000,1 一堆中石子数 50000

思路:

运用贪心算法思想,每次都取石子数量最多和第二多的两堆石子进行合并 *** 作(进行排序 *** 作后取前两个数),即可得到每次 *** 作的得分为最大,最后再将每次的 *** 作得分最大值相加求和即可得到整个 游戏 过程中 *** 作的总得分的最大值。

代码:

欢迎大家采纳和指正!

更多内容请持续关注该账号或CSDN的 RuthlessL!

以上就是关于求C语言取石子游戏的思路 请详细点全部的内容,包括:求C语言取石子游戏的思路 请详细点、取石子游戏、A、B、C三个盘子里各放了3、4、5个石子,甲乙两人轮流从中取出石子,游戏规则如下:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10171463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存