| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1351 人关注过本帖
标题:一个有趣的题!求解!
只看楼主 加入收藏
xujiaming007
Rank: 2
等 级:论坛游民
帖 子:4
专家分:20
注 册:2008-11-23
收藏
得分:0 
回复 楼主 lzy19870721 的帖子
经典纳什博弈论
有意讨论电脑知识及 算法和 语言类网络类 知识的人 可以入群 75126876
2008-11-23 13:18
jdh99
Rank: 2
来 自:南师大
等 级:论坛游民
威 望:1
帖 子:59
专家分:15
注 册:2008-11-7
收藏
得分:0 
这里面的判断比较复杂了,比如π,31415926,大家试着从最聪明的角度取数

作鲲鹏,遨游于天地沧海
2008-11-23 13:28
jdh99
Rank: 2
来 自:南师大
等 级:论坛游民
威 望:1
帖 子:59
专家分:15
注 册:2008-11-7
收藏
得分:0 
如果数字足够长,应该有N种方案,而输赢也未定

作鲲鹏,遨游于天地沧海
2008-11-23 13:31
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
9L,你用你的程序算算3,5,3,2这组数据。按照你的算法,是后取者胜。但实际上如果第一轮先取者取2而不是更大的3,那么先取者就可以胜利。

下面的算法是完全极大极小博弈算法。指数级别的复杂度。仅供参考。有兴趣的可以查阅估价函数和ab剪枝的内容。不过这个题状态空间不那么多,我就直接硬搜了……

程序代码:
#include <stdio.h>
#include <stdlib.h>

#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))

typedef struct node
{
    int *lhs, *rhs;
    int sa, sb;
} game_node;

int min_max(game_node *n, int player, int level)
{
    int lhv, rhv;
    game_node orig_n = *n;

    if (n->lhs > n->rhs)
    {
        if (player)
            return n->sa > n->sb;
        else
            return n->sb > n->sa;
    }

    *(player ? &n->sa : &n->sb) += *n->lhs++;
    lhv = min_max(n, !player, level + 1);

    if ((player && lhv) || (!player && !lhv))
        return lhv;

    *n = orig_n;
    *(player ? &n->sa : &n->sb) += *n->rhs--;
    rhv = min_max(n, !player, level + 1);

    return rhv;
}

int main(void)
{
    int a[] = {3, 5, 3, 2};
    game_node inital = {a, a + 3, 20, 20};
    printf("%s player win!\n", min_max(&inital, 1, 0)?"first":"second");
    printf("score: %d - %d\n", inital.sa, inital.sb);
    return 0;
}


[[it] 本帖最后由 StarWing83 于 2008-11-23 13:52 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-11-23 13:48
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
StarWing83 在 2008-11-23 13:48 的发言:

9L,你用你的程序算算3,5,3,2这组数据。按照你的算法,是后取者胜。但实际上如果第一轮先取者取2而不是更大的3,那么先取者就可以胜利。

下面的算法是完全极大极小博弈算法。指数级别的复杂度。仅供参考。有兴趣的 ...



貌似不用博弈论也可以解决....
如果用了alpha-beta,要注意边界的特殊设定,否则会出错的。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-11-23 15:51
alex_xu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-24
收藏
得分:0 
#include <iostream.h>
int a[4]={1,7,83,4};
int b[4];
//int m,n;
int *m=a;
int *n=&a[3];
int sum1;
int sum2;
static int i=0;
int main(void)
{
while(m!=n)
{
    if(*m>*n)
    {
      b[i]=*m;
      m++;
    }
    else
    {
      b[i]=*n;
      n--;
    }
    i++;
}
b[i]=*m;
for(i=0;i<4;i++)
{
    if((i%2)==0)
      sum1+=a[i];
    else
      sum2+=a[i];
}
cout<<sum1<<','<<sum2<<endl;
return 0;
}
在vc6.0上编译通过。
楼上的问题都想的太过复杂了吧。

[[it] 本帖最后由 alex_xu 于 2008-11-24 21:07 编辑 [/it]]
2008-11-24 20:51
lzy19870721
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-3-11
收藏
得分:0 
谢谢大家!学到很多!感觉还是9l的算法就可以了!无论什么情况,最后取得的数的总和就有两种(suma,sumb),只是顺序问题!
2008-11-25 20:13
快速回复:一个有趣的题!求解!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028294 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved