做了华容道在线解题程序之后,就想遍历所有开局,找出真正不重复的开局
到目前为止还没有找出有效地生成所有开局的方法:
开局的定义(参见:http://www.fayaa.com/youxi/hrd/#game-spec):
4x5的格子,必须由10个方块组成
-- 1个2x2方块(曹操),称之为Block
-- 5个两格方块(大将,可横可竖),称之为HV,横为H,竖为V
-- 4个一格方块(小兵),称之为Dot
-- 2个空白小块
我的想法是,按照Block -> HV -> Dot这样的摆放顺序来求组合
Block有12种摆放位置
然后HV摆完就只剩6个空位置了,C(16, 6) = 8008 (由于排列的限制,很可能比这个小,甚至小一个数量级)
HV的组合有H0V5 -> H5V0,共6种可能性
然后Dot摆完,就只剩下2个空位置了,C(6, 2) = 15
12 * 6 * 15 * 8008 = 8648640
也就是说,最多只可能有8648640种组合
但是有效的怎么生成他们呢?又怎么在生成的过程中避免重复以及无效的布局呢?
至今没想到有效地办法,主要是卡在HV的处理上
有没有什么想法?
呵呵很不错的想法,离散数学里面国际象棋的马踏棋盘好像就用到了黑白两色的方法
对称性的想法很好,不过就算再加上曹操不可能在出口,也只能减为7种可能性
剩下的四个小方块是C(6,4)
7*C(8,3)*C(8,3)*C(6,4) = 329280
然后对于C(8,3)*C(8,3)中的每一个,都可能是H0V5 -> H5V0中的组合,共6种
329280*6=1975680
然后呢,还少算了一些,对于非H0V5和H5V0的情况,比如H2V3,则对于C(8,3)*C(8,3)中的每一个,可能有许多种排放方式
所以我觉得最不好弄的就是最后说的这个H/V的组合
"不是很明白你说的这个H/V组合. 我觉得一旦曹操,小兵,空格定好了之后,留给五虎上将的可能卡位就不多了吧 "
2008/10/25 realfun <rea...@gmail.com>"不是很明白你说的这个H/V组合. 我觉得一旦曹操,小兵,空格定好了之后,留给五虎上将的可能卡位就不多了吧 "其实有个更简单的做法,你可以从所有合法的结束局面倒推起,可以找到所有合法的局面了^_^
"不是很明白你说的这个H/V组合. 我觉得一旦曹操,小兵,空格定好了之后,留给五虎上将的可能卡位就不多了吧 "是不多,但是你怎么把这些"可能卡位"找出来呢?不是一样要先找出所有的情况然后消除掉无效的卡位?
我也知道最后有效地布局不会很多,但是要做一个千万级的布局过滤也不是很容易的
所以我才会想有什么方式可以在生成的时候就减少这种无效布局2008/10/25 spell scroll <spell...@gmail.com>
2008/10/25 realfun <rea...@gmail.com>
呵呵很不错的想法,离散数学里面国际象棋的马踏棋盘好像就用到了黑白两色的方法马踏棋盘? 能具体说说什么问题码? 遍历棋盘的步数? 可能走法数目?
对称性的想法很好,不过就算再加上曹操不可能在出口,也只能减为7种可能性OK. 原来上下是不对称的. :-)
剩下的四个小方块是C(6,4)
7*C(8,3)*C(8,3)*C(6,4) = 329280
然后对于C(8,3)*C(8,3)中的每一个,都可能是H0V5 -> H5V0中的组合,共6种
329280*6=1975680
然后呢,还少算了一些,对于非H0V5和H5V0的情况,比如H2V3,则对于C(8,3)*C(8,3)中的每一个,可能有许多种排放方式
所以我觉得最不好弄的就是最后说的这个H/V的组合
不是很明白你说的这个H/V组合. 我觉得一旦曹操,小兵,空格定好了之后,留给五虎上将的可能卡位就不多了吧 .
比如 在你http://www.fayaa.com/youxi/hrd/, 前10个开局里只有3,7,8,9有很有限的几种选择, 其他的都是唯一的.
--代码发芽网: http://www.fayaa.com/code/ (无需插件支持blog代码高亮,100+种语言,30+种高亮主题)
游戏发芽网: http://www.fayaa.com/youxi/ (华容道等在线小游戏)
我的Blog: 半瓶墨水(http://www.2maomao.com/blog)
程序写的没错
呵呵不过这还要再乘上C(6,2)=15,因为四个小点要确定下来
再加上其他6个曹操位置,得到的结果差不多是17万个开局
由开局再算到最佳解,一个10毫秒,需要差不多半小时才能算到结束
呵呵我还是来尝试一下倒推
这两天在家啊带孩子,写的很慢
日,刚写完终局的生成器,尝试recursive yield方式导致的(可以看下面代码的版本1,就是使用recursive yield)
代码着这里:http://www.fayaa.com/code/view/453/
共有804个可能的终局
看看明天有没有时间推出所有开局了
On Nov 3, 6:30 pm, realfun <real...@gmail.com> wrote:
> 一开始我也是这么想的,但后来画张图分析过,这样倒推求解所有开局的方法不成立
为什么?
>
> 整个 python 程序现在只要 5 秒, 而且最长的的确是138, 和你的观察一样。
>
> 另外我有90%的相信我的 262243 是正确的开局数目, 你的数目如何得到的?
大家报告程序执行时间的时候能不能顺带说一下机器配置, 以便参考.