| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4124 人关注过本帖, 1 人收藏
标题:煮酒论英雄 众高手进来坐坐
取消只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
结帖率:100%
收藏(1)
已结贴  问题点数:100 回复次数:20 
煮酒论英雄 众高手进来坐坐
C论坛热闹有余,但精彩论题不多。基本是新人雀跃,老将藏刀旁观。

大概是高手们厌倦了这里到处都是的入门级(还有部分智障级)的提问,给分也提不起他们的兴趣了。

一旦众高手对这里完全失去了兴趣,这将是论坛的重大损失。(恐怕已经损失不少了)

兄弟斗胆提议,众高手有没有兴趣来下下棋?

当然,各位身在大江南北,想聚大家到一起品茗弈棋是不太可能了。

在网上对弈还是可以的。

不过就这么人和人下棋也没什么意思。不如让我们的程序和程序下棋如何?

众高手要是有兴趣的话就进来咱们议一议。

准备下什么棋、怎么下、程序的通讯接口方式等等。

或哪位有更有趣的并可实现的提议也不妨进来谈谈。(黑五角大楼主机这样的议题就免了,兄弟没那水平)

众英雄,廉颇老矣,尚能饭否?


最后顺道说说有容《大家用计算机解决个实际问题吧。》贴子中提到的问题。原贴见https://bbs.bccn.net/thread-370746-1-1.html

在原贴中我个人悬赏100专家分想激励坛友参与。可惜没什么达到预期的效果。

部分有能力的朋友这两天好像不在,还有一部分可能是不屑于解决这样的问题。

总之,到现在也没有出现让人满意的回答。这让我有一点失望。

在原贴中我说过这个问题的难度分两层。

第一层,找出满足要求的排列。

这一层很基础,不管算法如何,大家基本还是能做到的。

第二层,计算“找到的满足要求的排列”变换到“题目中给出的排列”所需的最少的交换次数。

这一层其实也不难,可惜到现在也没见一个可行的算法模型出来。众坛友的问题建模能力还有待提高。

其实这一层可以归结为图中的最短路径问题。属于图论的知识范畴,我记得以前就有人讨论过Dijkstra算法,完全可以直接应用到这里。

每一个排列可以看作是一个状态结点。

如果一个排列通过交换一对元素的位置可以变成另一个排列,那么用一条边关联这两个排列的状态结点。

由此构成一个图。

在这个理论模型上,连接两个点的最少的边数(也称两点的距离,可以认为每条边的权为1)即是从一个排列变换到另一个排列需要的最少次数。

对于原题,就是找从“728196345”到一个满足第一层要求的结点的距离。

关于最短路径算法我也不想在这里详述了。没学过但有兴趣的朋友,随便找本图论或算法的书看看,里面都会讲到。

最后送上我的代码给各位参考。我使用队列来存储点集,而队列以单向链表构成。各位也可以按自己的想法用数组等等来实现。

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

typedef struct _node
{
    int state;
    int value;
    struct _node * next;
}NODE;

typedef struct
{
    NODE * head;
    NODE * tail;
}QUEUE;

void queue_clear(QUEUE * q)
{
    NODE *p, *t;
    for(p = q->head; p != NULL;)
    {
        t = p;
        p = p->next;
        free(t);
    }
    q->head = NULL;
    q->tail = NULL;
}

int queue_push(QUEUE * q, int state, int value)
{
    NODE *p, *t;
    if((p = (NODE *)malloc(sizeof(NODE))) == NULL) return 0;
    p->state = state;
    p->value = value;
    p->next = NULL;
    if(q->head == NULL) q->head = p; else q->tail->next = p;
    q->tail = p;
    return 1;
}

int queue_pop(QUEUE * q, int * state, int * value)
{
    NODE * p;
    if(q->head == NULL) return 0;
    *state = q->head->state;
    *value = q->head->value;
    p = q->head;
    q->head = q->head->next;
    free(p);
    return 1;
}

int queue_find(QUEUE q, int state)
{
    NODE * p;
    for(p = q.head; p != NULL && p->state != state; p = p->next);
    return p != NULL;
}

int is_legal(int state)
{
    int a, b;
    a = state / 1000000;
    a = a / 100 * (a % 100);
    b = state / 1000 % 1000;
    if(a != b) return 0;
    a = state % 1000;
    a = a / 10 * (a % 10);
    return a == b;
}

int swap(int state, int i, int j)
{
    const int e[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 
100000000};
    int a, b;
    a = state / e[i] % 10;
    b = state / e[j] % 10;
    state -= a * e[i];
    state -= b * e[j];
    state += a * e[j];
    state += b * e[i];
    return state;
}

int test(int initState, int * finalState, int * value)
{
    int s, v, ts, i, j;
    QUEUE q = {NULL, NULL};
    queue_push(&q, initState, 0);
    while(queue_pop(&q, &s, &v))
    {
        for(i = 0; i < 9; i++)
        for(j = i + 1; j < 9; j++)
        {
            ts = swap(s, i, j);
            if(is_legal(ts))
            {
                *finalState = ts;
                *value = v + 1;
                queue_clear(&q);
                return 1;
            }
            if(!queue_find(q, ts)) queue_push(&q, ts, v + 1);
        }
    }
    return 0;
}

int main()
{
    int state, value;
    if(test(728196345, &state, &value))
        printf("%d step %d\n", state, value);
    else
        printf("no match.\n");
    return 0;
}


[ 本帖最后由 beyondyf 于 2012-6-6 20:07 编辑 ]
搜索更多相关主题的帖子: 如何 
2012-06-06 20:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
不难,先看看大家的意向。之后我会解释我的方案。如果大家认可,我可以负责对战平台的编写。

重剑无锋,大巧不工
2012-06-06 20:34
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 4楼 小赵q1
不必。而且我是建议同时学的。

我想你还是心太急了,欲速则不达。

重剑无锋,大巧不工
2012-06-06 21:36
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
pangding版主言重了。仅仅是想邀高手们在一起的一个娱乐项目。没想过达到“更深的蓝”那样的级别。

围棋、象棋这些太复杂的话,可以从简单的玩起。哪怕井字棋也好嘛。

一个项目确实无法兼顾到所有方面的专家。这点很报歉。我会尽力将对战接口简化,个人的程序只需要关注如何出棋,至于局势的显示交给对战平台好了。

也想过其它形式的对抗方案,但最容易实现的还是回合制有限状态式的方案(好好说话,战棋类游戏)

如果你有好的建议尽请提出来。我希望借此把众高手的休闲时间都吸引到这里来。

重剑无锋,大巧不工
2012-06-07 09:07
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 10楼 demonleer
呃,这贴属于聊天贴,分数最后我会平分给大家。你想试的话可以到有容就大的原贴里提交,现在他的贴子还没结。

重剑无锋,大巧不工
2012-06-07 09:13
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 16楼 cuijunchao
你有没有这种感觉。当某个问题问到了点上,你不回答都觉得难受。分神马的都不重要了。

有潜质的新人是很招高手们的喜欢的

重剑无锋,大巧不工
2012-06-07 11:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,闻道点酸葡萄的味道。

几个人说北大好不见得能使北大的威名增几分,几个人说北大不好也不见得能使北大的威名减几分。北大就是北大,好与不好,它就在那里。何必强求别人与你同意?

喜欢ACM的依旧喜欢,不喜欢的依旧不喜欢。ACM就是ACM,喜欢或不喜欢,它就在那里。何必强求别人与你同意?

这种意识之争毫无意义。另外也别一说点什么就上纲上线。我煮这壶酒完全是消遣娱乐。愿意玩的,咱们就一起玩。不愿意玩的咱也不强求。

社会分工不同,什么样的人才都需要。全中国人都当程序员的话,谁来保家卫国,谁来耕种粮食,谁来织布造衣?

选择自己喜欢的方向发展,尊重别人的选择。

回到正题,这第一壶酒先征集一下大家的意向,有谁愿意下这盘棋。

第二壶酒,咱们讨论想下什么棋,以及怎么个下法。


再顺道说说demonleer的代码。这位兄弟新来不久,但编程的时间肯定不短了,同时也报着极大的热情。

不知道这位兄弟是以代码为生的,还是业余爱好?

你的代码是深度优先遍历状态空间。这种方式可以找到满足条件的排列。不过还不能计算两个状态之间经历的最少变换次数。

有兴趣就再考虑一下这个要求,不过还是别耽误了工作的好。

重剑无锋,大巧不工
2012-06-07 17:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 28楼 rjvsky
好吧,如果现在让你来构建这个程序对弈的方案,你有什么想法?

先不管如何实现,只需要用语言描述一下你想像中这个过程是如何进行的。

重剑无锋,大巧不工
2012-06-07 17:13
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 30楼 demonleer
幸会 幸会!

前段时间开始玩单片机,51芯片玩腻了,正准备试试ARM。有机会请多指教。

重剑无锋,大巧不工
2012-06-07 17:26
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
承让了,欢迎多交流。兄弟对我提议的游戏有兴趣么?

重剑无锋,大巧不工
2012-06-07 17:33
快速回复:煮酒论英雄 众高手进来坐坐
数据加载中...
 
   



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

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