#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个石子,甲乙两人轮流从中取出石子,游戏规则如下:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)