无心人 发表于 2008-7-2 10:40:17

:b:

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

mathe 发表于 2008-7-2 10:42:00

原帖由 gxqcn 于 2008-7-2 10:36 发表 http://bbs.emath.ac.cn/images/common/back.gif


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

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

有一种方法,可以将程序所有结果为SUCC的状态输出来看看是否有规律。(可以只输出先手和后手牌的数目相等或先手比后手多一张牌两类)

无心人 发表于 2008-7-2 10:44:04

:handshake

就是说,没有开局策略
只有具体的一个个局面的排列

mathe 发表于 2008-7-2 10:45:27

原帖由 无心人 于 2008-7-2 10:40 发表 http://bbs.emath.ac.cn/images/common/back.gif
:b:

看的比一头雾水还雾水
这就是C/C++的好处哦
这个同语言关系不大,同使用的注释,代码风格,使用算法的复杂度,还有阅读者对语言的熟悉程度都有关系:lol

无心人 发表于 2008-7-2 10:52:34

呵呵
确实
至今我对C/C++都只能说入门

我起步的语言是Pascal
在尝试看懂C之前经历了三年
连函数都弄不懂
而那时已能明白汇编了

mathe 发表于 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 发表 http://bbs.emath.ac.cn/images/common/back.gif
有简单的方法吗?计算机说只要先手先出3,4,5或6都可以赢
程序不对吧,我把你的程序里50改成7,怎么还是先手必胜?明显是必败的啊。我写了个程序,直接递归搜索,结果50也是必败的,而且随着数字的增大,先手获胜的机会越来越小。

chriswang 发表于 2008-7-2 13:00:55

感觉程序确实有些问题

mathe 发表于 2008-7-2 14:00:01

的确题目是先手负,忘记了每次产生下一个状态要交换两个人状态,所以产生状态顺序不再单调了,所以不能顺序产生,修改一下代码:
#include <stdio.h>

#define LIMIT (1<<24)
int states;
#define FAIL -1
#define SUCC -2
#define R 50
void gen(int left);
int get_state(int x){
    if(states==0){
      gen(x);
    }
    return states;
}
void gen(int left){
    int first_u=left&((1<<12)-1);
    int second_u=left>>12;
    int cfirst,csecond;
    int i,sum;
    cfirst=csecond=0,sum=0;
    for(i=0;i<6;i++){
      int c1=(first_u>>(2*i))&3;
      int c2=(second_u>>(2*i))&3;
      cfirst+=c1;
      csecond+=c2;
      sum+=(c1+c2)*(i+1);
    }
    if(cfirst!=csecond&&cfirst-1!=csecond)
      return;
    sum=126-sum;
    if(sum>R){
      states=FAIL;
    }else if(sum==R){
      states=SUCC;
    }else{
      int s,j;
      for(i=0;i<6;i++){
            s=(first_u>>(2*i))&3;
      }
      for(i=0;i<6;i++){
            int new_u=first_u;
            int reach;
            if(s>0){
                new_u-=1<<(2*i);
                reach=second_u|(new_u<<12);
                if(get_state(reach)==SUCC)
                  break;
            }
      }
      if(i<6){
            states=FAIL;
      }else{
            states=SUCC;
      }
    }
}

void output_states(int x);
int next_state(int x)
{
    int first_u=x&((1<<12)-1);
    int second_u=x>>12;
    int i,s;
    for(i=0;i<6;i++){
      s=(first_u>>(2*i))&3;
    }
    int reach=-1;
    for(i=0;i<6;i++){
      int new_u=first_u;
      if(s>0){
            new_u-=1<<(2*i);
            reach=second_u|(new_u<<12);
            if(states==SUCC){
                output_states(reach);
            }
      }
    }
    return reach;
}

void output_states(int x)
{
    printf("State %06x:",x);
    if(states==SUCC){
      printf("F");
    }else{
      printf("S");
    }
    printf("\n");
}

int main()
{
    int i;
    gen(LIMIT-1);
    output_states(LIMIT-1);
    printf("next states:\n");
    next_state(LIMIT-1);
    return 0;
}
页: 1 [2] 3 4
查看完整版本: 一个老题,扑克博弈