精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>算法集锦--------梦入玄机>>摸牌决胜负算法>>Re: 请教一道算法问题?

主题:Re: 请教一道算法问题?
发信人: mrcloud()
整理人: yangcs(2000-03-12 09:42:24), 站内信件
【 在 nan_yue (岚月) 的大作中提到: 】
:     有一副牌有 m 张,分别由甲乙两人摸牌,规则如下:
:         1.由甲先摸牌,第一次最多能摸  m-1 张;
:         2.然后由乙甲轮流摸牌,后一个人摸牌数不能超过前一个人的两倍;
:         3.由谁摸到最后一张牌为获胜者.
:    .......

#include <iostream.h>
// 甲乙当然都不会把牌取到只剩一张
// 或能让对方一次就可以拿完的情况
int GetN(int n,int m)
// n是有几张可以取,m是对方上次取了几张
{
  int i,j;
  if(n<=m*2||n==1)return n; // 一次可以取完
j=(n-1)/3; // 保证j<(n的三分之一)
for(i=1;i<=j;i++)
// 从1取到j,只要有一次对方必输就表示这样取能赢
if(!GetN(n-i,i))return i;
return 0;
// 否则必输
}
void main()
{
int N;
cout<<"请输入牌数(0退出):";
cin>>N;
  while(N)
  {
    if(GetN(N,0))cout<<"甲说:我果然又嬴了!"<<endl<<endl;
else cout<<"甲说:这怎么可能...$#%@*&^!!!"<<endl<<endl;
cout<<"请输入牌数(0退出):";
cin>>N;
  }
}
// 结果不是每种情况甲都可以必胜,比如2,3,5,8,12,18等.
// 到30以上速度就慢了,我的方法不好,应该有更好的方法.
// 如果想得到每一步的应对策略的话,只要小小的改动即可.
// (递归过程的返回值就是应取的数)


--
...我的征途是星辰大海...

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.63.121]

[关闭][返回]