- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2608
- 在线时间
- 小时
|
发表于 2008-11-13 11:22:02
|
显示全部楼层
编了一下,依据现在我的状态,不一定对哦。呵呵。
在L中dx表示和对方的分数差,last表示如果分数相等该谁拿,x表示桌面上剩下了哪些牌。这些信息表明了当前的状态,用函数p表示在此状态下的得分。
sb用来缓存已经计算过的p值,防止重复计算,但是貌似效率提升不大。呵呵。
结果是-1,就是说甲会输1分。- #include <conio.h>
- int sb[111][2][1024];
- int init()
- {
- int i,j,k;
- for(i=0;i<111;i++)
- for(j=0;j<2;j++)
- for(k=0;k<1024;k++)
- sb[i][j][k]=1000;
- return 0;
- }
- int max(int *ps,int psn)
- {
- int i,r;
- r=ps[0];
- for(i=1;i<psn;i++)if(ps[i]>r)r=ps[i];
- return r;
- }
- int min(int *ps,int psn)
- {
- int i,r;
- r=ps[0];
- for(i=1;i<psn;i++)if(ps[i]<r)r=ps[i];
- return r;
- }
- struct L{int dx,last;unsigned x;};
- int p(struct L s)
- {
- // printf("%X.",s.x);
- struct L s1,s2;
- unsigned k;
- int i,psn,p1,p2,ps[10];
- if(s.x==0)return s.dx;
- p1=sb[s.dx+55][s.last][(int)s.x];
- if(p1!=1000)return p1;
- psn=0;
- if(s.dx>0||(s.dx==0&&s.last==1))
- {
- for(i=0;i<10;i++)
- {
- k=1<<i;
- if((k&s.x)!=0)
- {
- s1.x=s.x&(~k);s2.x=s.x&(~k);s1.dx=s.dx+(i+1);s2.dx=s.dx-(i+1);s1.last=1;s2.last=1;p1=p(s1);p2=p(s2);
- ps[psn++]=(p1<p2)?p1:p2;
- }
- }
- return max(ps,psn);
- }
- else
- {
- for(i=0;i<10;i++)
- {
- k=1<<i;
- if((k&s.x)!=0)
- {
- s1.x=s.x&(~k);s2.x=s.x&(~k);s1.dx=s.dx+(i+1);s2.dx=s.dx-(i+1);s1.last=1;s2.last=1;p1=p(s1);p2=p(s2);
- ps[psn++]=(p1>p2)?p1:p2;
- }
- }
- return min(ps,psn);
- }
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- L s;
- s.dx=0;s.last=1;s.x=0x3ff;
- init();
- printf("[%d]",p(s));
- _getch();
- return 0;
- }
复制代码 |
|