找回密码
 欢迎注册
楼主: 风云剑

[讨论] 一个老题,扑克博弈

[复制链接]
发表于 2008-7-2 10:40:17 | 显示全部楼层


看的比一头雾水还雾水
这就是C/C++的好处哦
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:42:00 | 显示全部楼层
原帖由 gxqcn 于 2008-7-2 10:36 发表


可否用文字具体叙述之后的出牌策略?


现在只有计算机使用的策略,不知道能否有简单的规律.

有一种方法,可以将程序所有结果为SUCC的状态输出来看看是否有规律。(可以只输出先手和后手牌的数目相等或先手比后手多一张牌两类)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:44:04 | 显示全部楼层


就是说,没有开局策略
只有具体的一个个局面的排列
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:45:27 | 显示全部楼层
原帖由 无心人 于 2008-7-2 10:40 发表


看的比一头雾水还雾水
这就是C/C++的好处哦

这个同语言关系不大,同使用的注释,代码风格,使用算法的复杂度,还有阅读者对语言的熟悉程度都有关系
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:52:34 | 显示全部楼层
呵呵
确实
至今我对C/C++都只能说入门

我起步的语言是Pascal
在尝试看懂C之前经历了三年
连函数都弄不懂
而那时已能明白汇编了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 11:04:55 | 显示全部楼层
我在学习C/C++之前也学过BASIC,FORTRAN,8086汇编,Pascal
不过现在其他都忘得差不多了,只有C/C++由于经常使用,越来越熟悉了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 11:14:40 | 显示全部楼层
C/C++的逻辑是
语法的字符简单,字符!!
贴近硬件,所以灵活多变

很佩服近40年的老语言还这么健壮
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-7-2 12:58:22 | 显示全部楼层
原帖由 mathe 于 2008-7-2 09:31 发表
有简单的方法吗?计算机说只要先手先出3,4,5或6都可以赢

程序不对吧,我把你的程序里50改成7,怎么还是先手必胜?明显是必败的啊。我写了个程序,直接递归搜索,结果50也是必败的,而且随着数字的增大,先手获胜的机会越来越小。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 13:00:55 | 显示全部楼层
感觉程序确实有些问题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 14:00:01 | 显示全部楼层
的确题目是先手负,忘记了每次产生下一个状态要交换两个人状态,所以产生状态顺序不再单调了,所以不能顺序产生,修改一下代码:

  1. #include <stdio.h>

  2. #define LIMIT (1<<24)
  3. int states[LIMIT];
  4. #define FAIL -1
  5. #define SUCC -2
  6. #define R 50
  7. void gen(int left);
  8. int get_state(int x){
  9.     if(states[x]==0){
  10.         gen(x);
  11.     }
  12.     return states[x];
  13. }
  14. void gen(int left){
  15.     int first_u=left&((1<<12)-1);
  16.     int second_u=left>>12;
  17.     int cfirst,csecond;
  18.     int i,sum;
  19.     cfirst=csecond=0,sum=0;
  20.     for(i=0;i<6;i++){
  21.         int c1=(first_u>>(2*i))&3;
  22.         int c2=(second_u>>(2*i))&3;
  23.         cfirst+=c1;
  24.         csecond+=c2;
  25.         sum+=(c1+c2)*(i+1);
  26.     }
  27.     if(cfirst!=csecond&&cfirst-1!=csecond)
  28.         return;
  29.     sum=126-sum;
  30.     if(sum>R){
  31.         states[left]=FAIL;
  32.     }else if(sum==R){
  33.         states[left]=SUCC;
  34.     }else{
  35.         int s[6],j;
  36.         for(i=0;i<6;i++){
  37.             s[i]=(first_u>>(2*i))&3;
  38.         }
  39.         for(i=0;i<6;i++){
  40.             int new_u=first_u;
  41.             int reach;
  42.             if(s[i]>0){
  43.                 new_u-=1<<(2*i);
  44.                 reach=second_u|(new_u<<12);
  45.                 if(get_state(reach)==SUCC)
  46.                     break;
  47.             }
  48.         }
  49.         if(i<6){
  50.             states[left]=FAIL;
  51.         }else{
  52.             states[left]=SUCC;
  53.         }
  54.     }
  55. }

  56. void output_states(int x);
  57. int next_state(int x)
  58. {
  59.     int first_u=x&((1<<12)-1);
  60.     int second_u=x>>12;
  61.     int i,s[6];
  62.     for(i=0;i<6;i++){
  63.         s[i]=(first_u>>(2*i))&3;
  64.     }
  65.     int reach=-1;
  66.     for(i=0;i<6;i++){
  67.         int new_u=first_u;
  68.         if(s[i]>0){
  69.             new_u-=1<<(2*i);
  70.             reach=second_u|(new_u<<12);
  71.             if(states[reach]==SUCC){
  72.                 output_states(reach);
  73.             }
  74.         }
  75.     }
  76.     return reach;
  77. }

  78. void output_states(int x)
  79. {
  80.     printf("State %06x:",x);
  81.     if(states[x]==SUCC){
  82.         printf("F");
  83.     }else{
  84.         printf("S");
  85.     }
  86.     printf("\n");
  87. }

  88. int main()
  89. {
  90.     int i;
  91.     gen(LIMIT-1);
  92.     output_states(LIMIT-1);
  93.     printf("next states:\n");
  94.     next_state(LIMIT-1);
  95.     return 0;
  96. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-29 09:27 , Processed in 0.043464 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表