#include<stdio.h>
int main()
{
int num1,num2
printf("请玩家输入<1表示石头、2表示剪子、3表示布>:")
scanf("%d",&num1)
printf("请玩家输入<1表示枣此石头、2表示剪子、3表示布>:")
scanf("%d",&num2)
//枚举可能出现的各种情况
if(num1==1 &&num2==1) // 1 1
{
printf("玩家一选择石头 ,玩家二选择石头,平局\n")
}
else if(num1==1 &&num2==2) // 1 2
{
printf("玩家一选择石头 ,玩家二选择剪子,玩家一胜利\n")
}
else if(num1==1 &&num2==3) /誉岩猛/1 3
{
printf("玩家一选择石头 ,玩家二选择布,玩家二胜利\n"庆桥)
}
else if(num1==2 &&num2==1) //2 1
{
printf("玩家一选择剪子 ,玩家二选择石头,玩家二胜利\n")
}
else if(num1==2 &&num2==2) //2 2
{
printf("玩家一选择剪子 ,玩家二选择剪子,平局\n")
}
else if(num1==2 &&num2==3) //2 3
{
printf("玩家一选择剪子 ,玩家二选择布,玩家一胜利\n")
}
else if(num1==3 &&num2==1) //3 1
{
printf("玩家一选择布 ,玩家二选择石头,玩家一胜利\n")
}
else if(num1==3 &&num2==2) //3 2
{
printf("玩家一选择布 ,玩家二选择剪子,玩家二胜利\n")
}
else //3 3
{
printf("玩家一选择布 ,玩家二选择布,平局\n")
}
return 0
}
用动态规划注意:石子合并问题和最优二叉树是不同的。
我们先考虑求最大分值。
用a数组存放原来N堆石子的初始数量,下标从0开始。
每一次合并是对现在的某两堆相邻石子的,而这相当于将初始时的的若干堆石子合并。
用b[i,j]表示将从初始的第j堆石子开始,循环芦知向后共i堆石子合并的最大分值。(第N-1堆石子后面是第0堆脊含)
假设最后一次是前k堆合并成的一堆和剩下的i-k堆石子合并成的一堆进行合并。所以总分值就是:这两堆各自合并的总得分 加上 最后一次全部合并的得分。
状态转移方程b[i,j]=max{ b[k,j]+b[i-k,(j+k) mod N] | k=1..i-1 } + a[j] +…+ a[(j+i-1) mod N]b[1,i]=0, i=0..n-1
最后,解就是陪野消b[N,0]到b[N,N-1]中的最大值。
#include<stdio.h>改慧int main()
{
printf("0表示石头.\n")
printf("1表示剪刀.\n")
printf("2表示布.\n"兆悄)
printf("请出拳.\n")
int a,b,c
scanf("%d%d,&a,&b")
c=a-b
switch(c)
{
case -2: printf("后手赢.\n") break
case -1: printf("先手赢.\n") break
case 族歼渣0: printf("平手.\n") break
case 1:
if(a==1)
printf("后手赢.\n")
else if(a==2)
printf("先手赢.\n")
break
case 2:printf("先手赢.\n") break
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)