魔方吧·中文魔方俱乐部

 找回密码
 注册
搜索
热搜: 魔方
查看: 116878|回复: 1
打印 上一主题 下一主题

隔空棋 [复制链接]

Rank: 1

积分
80
帖子
65
精华
0
UID
107099
性别
保密
1#
发表于 2009-10-11 21:06:18 |显示全部楼层
nim值法的优势在于,通过子游戏的值能很快得到母游戏的值。
在两维的情况下,一次操作并不一定会把整个棋盘变成两个或多个互不相关的子游戏。
所以计算nim值的计算量并不小,可能仅比穷举稍微少一点点。

但是nim值法仍然有其优势,就是当两个人用多个棋盘下棋时,直接把nim值异或就可以解决。

考虑了一下两维甚至多维的编程:把棋盘上的一格对应到两进制数的一位,如果允许下在某格,那么该位为1;如果不允许下在某格,那么该位为0;这样,任何棋盘状态都能一一对应到非负整数。每下一手,是把数字中若干位从1变成0。

用这个状态编码的方式编程,应该并不困难,也不容易出错。

使用道具 举报

Rank: 1

积分
80
帖子
65
精华
0
UID
107099
性别
保密
2#
发表于 2009-10-13 12:16:59 |显示全部楼层
第一解决棋盘扩大的问题。当棋盘从n*n扩大到(n+1)*(n+1),多出了2n+1个格子,这些格子对应的位就放在两进制数的高位。

第二解决状态是否是独立的多个部分。从任何一位1开始试探相邻的格子,直至找到最大连通分支,去掉该连通分支后,再找剩下的,最终把一个状态分成独立(相互不连通)的多个子游戏。

第三考虑形状相同但是位置不同的问题。其实不仅要考虑位置不同(平移),要是把旋转和反射都考虑进去就更好了。所谓变换,就是把二进制的位换来换去,算法不明,但应该是可行的。不论怎么变换,目标是在最高位形成尽量多的连续的0,这样就可以转化为已经计算过的情况。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|魔方吧·中文魔方俱乐部

GMT+8, 2024-5-7 10:54

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部