求教翻黑白棋算法。

xiaoxiami002 2011-05-10 04:54:47
题目:
翻转游戏是在4*4的正方形里进行的,每个小正方形放有拥有黑白两面的棋子。每一轮你翻转3-5个棋子,把它从白变黑或从黑变白。翻转的规则如下:
1. 选择任意一个棋子。
2. 翻转选择的棋子和与它相临的前后左右的棋子(如果有的话)。

跟详细的题目解释:http://blog.sina.com.cn/s/blog_61eccf0e0100g1gs.html

在线游戏演示:http://wanwan.sina.com.cn/xyx/iplay.php?id=106359

求算法思想。。
...全文
1143 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
如此美丽的你 2011-05-15
  • 打赏
  • 举报
回复
我们记I_n为n阶单位阵,B_n为主对角线和对角线边上元素都是1,其余都是0的矩阵,比如
B_4=
[1 1 0 0]
[1 1 1 0]
[0 1 1 1]
[0 0 1 1]
O_n为零阵
那么这个问题可以变成二阶域上一个m*n阶线性方程组
[B_n I_n O_n O_n ... O_n O_n]
[I_n B_n I_n O_n ... O_n O_n]
[O_n I_n B_n I_n ... O_n O_n] X = C
...
[O_n O_n O_n O_n ... I_n B_n]
即上面方程中系数矩阵是一个分块三对角阵,对角线都是B_n,对角线边上元素都是I_n,其余都是O_n
其中分块数目为m*m块。X,C为m*n阶向量,对应m*n棋盘,其中C代表初始布局(1代表黑格,0代表白格),解X给出一个方案,其中1表示翻这个格子,0表示不要翻。


这个问题同链接
http://topic.csdn.net/u/20071108/08/719928df-943e-4c4c-8c0a-0c50bedd3d02.html
中矩阵几乎相同,可以同样使用链接中14楼的方法求解,记我博客上给出的程序代码。

对于14楼的方法中,定义了矩阵数组
V_1 = I_n, V_2 = B_n, V_{k+1}=B_n*V_k+V_{k-1}
然后问题最后变成一个方程V_m*x1=u_m (需要注意F_2中加法和减法没有区别)
而这个问题中,如果仅仅求任意解,很简单,上面方程有解,取任意一个解就可以。
当然如果求最优方案,那么如果det(V_m)=0时,那么有解 必然有多个解,我们需要穷举所有的解,所以这时
f=n-rank(V_m)就代表了方程的自由度。而我们需要穷举的情况总共有2^f种。
绿色夹克衫 2011-05-14
  • 打赏
  • 举报
回复
学习了。

[Quote=引用 23 楼 mathe 的回复:]

比较有意思的是,如果参考链接中25楼,
记函数f(1,x)=1,f(2,x)=x, f(n+1,x)=x*f(n,x)-f(n-1,x)
那么f(n,2x)就是第二类切皮雪夫多项式.
那么我们可以发现
V_m=f(m,B_n) (mod 2) (注意模2加法和减法没有区别)
由于V_m是对称阵,特征值0的重数就是方程的自由度
假设B_n在二阶域的扩域中特征值分别为r1,r2,...,……
[/Quote]
mathe 2011-05-14
  • 打赏
  • 举报
回复
算法可以参考22楼的介绍,实际上我们只需要解一个二阶域上的n*n的方程(如果n<=m):V_m*x1=u_m)
解出来以后,x1的通解正好是第一行的所有合法方案
mathe 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fancymouse 的回复:]
经典算法就两个啦,一个是枚举第一行的2^m*m*n,一个是高斯消元的(m*n)^3。鉴于一般情况下m很小,其实理论上第一个更快,也更容易编程。
[/Quote]
我的解方程方法的复杂度是mn^2+2^f*m*n,其中f是自由度,最差情况f=m.最好情况f=0.所以速度一般来说,都要快一些(只有一些特殊情况自由度比较高时要多花费一些预处理时间)
FancyMouse 2011-05-14
  • 打赏
  • 举报
回复
经典算法就两个啦,一个是枚举第一行的2^m*m*n,一个是高斯消元的(m*n)^3。鉴于一般情况下m很小,其实理论上第一个更快,也更容易编程。
mathe 2011-05-13
  • 打赏
  • 举报
回复
解方程的问题是解可能不唯一,这时,我们需要计算还余下多少个自由度,然后穷举才可以得到最优解。
比如最后余下h个自由度,那么对于这h个自由度,我们需要穷举2^h个可能值(它们都可以取0或1)。
当然,如果我们不需要最优解,那么这h个自由度就可以任意选择,那么就可以得到一个还算不错的随机解。
[Quote=引用 14 楼 litaoye 的回复:]
呵呵,计算机搜的,解方程的话求最优似乎有些问题。


引用 13 楼 mathe 的回复:
异或操作是可以交换的,所以同操作顺序没有关系。这也为什么可以BFS。
litaoye是利用计算机搜索还是手工破解呢?
发现我以前写的程序只处理了方阵,需要修改一下才能处理非方阵情况
[/Quote]
xiaoxiami002 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mathe 的回复:]

异或操作是可以交换的,所以同操作顺序没有关系。这也为什么可以BFS。
litaoye是利用计算机搜索还是手工破解呢?
发现我以前写的程序只处理了方阵,需要修改一下才能处理非方阵情况
[/Quote]

不大明白。。。。
mathe 2011-05-13
  • 打赏
  • 举报
回复
比较有意思的是,如果参考链接中25楼,
记函数f(1,x)=1,f(2,x)=x, f(n+1,x)=x*f(n,x)-f(n-1,x)
那么f(n,2x)就是第二类切皮雪夫多项式.
那么我们可以发现
V_m=f(m,B_n) (mod 2) (注意模2加法和减法没有区别)
由于V_m是对称阵,特征值0的重数就是方程的自由度
假设B_n在二阶域的扩域中特征值分别为r1,r2,...,rn.
那么V_m的特征值必然为f(m,r_1),f(m,r_2),...,f(m,r_n)
而对于B_n,计算其特征方程,可以知道实际其特阵方程为f(n,1+x)
所以方程的自由度实际上就是f(n,1+x)和f(m,x)的最大公因子
比如我们可以在二阶域中计算出
f(0,x)=1
f(1,x)=x
f(2,x)=x^2+1
f(3,x)=x^3
f(4,x)=x^4+x^2+1
f(5,x)=x^5+x
f(6,x)=x^6+x^4+1
f(7,x)=x^7
f(8,x)=x^8+x^6+x^4+1
F(9,X)=x^9+x^5+x
...
如果我们看4*4阶棋盘,那么就只需要计算
(f(4,1+x),f(4,x))
由于f(4,1+x)=(1+x)^4+(1+x)^2+1=1+x^4+1+x^2+1=x^4+x^2+1=f(4,x)
得出4*4阶自由度为4,我们需要穷举16种情况
而对于5*5阶
f(5,1+x)=(1+x)(1+x^4+1)=(1+x)x^4
f(5,x)=x(1+x^4)=x(1+x)^4
最大公因子为x(1+x),所以自由度为2,穷举4种情况
而对于4*9阶
(f(4,1+x),f(9,x))=((1+x+x^2)^2,x(1+x+x^2)^4),自由度为4.
当然更多情况,自由度为0.
绿色夹克衫 2011-05-13
  • 打赏
  • 举报
回复
呵呵,计算机搜的,解方程的话求最优似乎有些问题。

[Quote=引用 13 楼 mathe 的回复:]
异或操作是可以交换的,所以同操作顺序没有关系。这也为什么可以BFS。
litaoye是利用计算机搜索还是手工破解呢?
发现我以前写的程序只处理了方阵,需要修改一下才能处理非方阵情况
[/Quote]
mathe 2011-05-13
  • 打赏
  • 举报
回复
异或操作是可以交换的,所以同操作顺序没有关系。这也为什么可以BFS。
litaoye是利用计算机搜索还是手工破解呢?
发现我以前写的程序只处理了方阵,需要修改一下才能处理非方阵情况
mathe 2011-05-13
  • 打赏
  • 举报
回复
我们记I_n为n阶单位阵,B_n为主对角线和对角线边上元素都是1,其余都是0的矩阵,比如
B_4=
[1 1 0 0]
[1 1 1 0]
[0 1 1 1]
[0 0 1 1]
O_n为零阵
那么这个问题可以变成二阶域上一个m*n阶线性方程组
[B_n I_n O_n O_n ... O_n O_n]
[I_n B_n I_n O_n ... O_n O_n]
[O_n I_n B_n I_n ... O_n O_n] X = C
...
[O_n O_n O_n O_n ... I_n B_n]
即上面方程中系数矩阵是一个分块三对角阵,对角线都是B_n,对角线边上元素都是I_n,其余都是O_n
其中分块数目为m*m块。X,C为m*n阶向量,对应m*n棋盘,其中C代表初始布局(1代表黑格,0代表白格),解X给出一个方案,其中1表示翻这个格子,0表示不要翻。


这个问题同链接
http://topic.csdn.net/u/20071108/08/719928df-943e-4c4c-8c0a-0c50bedd3d02.html
中矩阵几乎相同,可以同样使用链接中14楼的方法求解,记我博客上给出的程序代码。

对于14楼的方法中,定义了矩阵数组
V_1 = I_n, V_2 = B_n, V_{k+1}=B_n*V_k+V_{k-1}
然后问题最后变成一个方程V_m*x1=u_m (需要注意F_2中加法和减法没有区别)
而这个问题中,如果仅仅求任意解,很简单,上面方程有解,取任意一个解就可以。
当然如果求最优方案,那么如果det(V_m)=0时,那么有解 必然有多个解,我们需要穷举所有的解,所以这时
f=n-rank(V_m)就代表了方程的自由度。而我们需要穷举的情况总共有2^f种。
mathe 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 litaoye 的回复:]
只要第一行输对了就可以了,后面的顺序来就行,另外边上有一个重玩按钮,输错了重玩应该就行。


引用 18 楼 mathe 的回复:
引用 10 楼 litaoye 的回复:
嘿嘿,得了91060分,应该是最高分了!

http://wanwan.sina.com.cn/xyx/iplay.php?id=106359

发现输错了一次就要全部重来,最高分还是不容易产生的
[/Quote]
这两个信息很重要,的确91060应该最高分了
绿色夹克衫 2011-05-13
  • 打赏
  • 举报
回复
只要第一行输对了就可以了,后面的顺序来就行,另外边上有一个重玩按钮,输错了重玩应该就行。

[Quote=引用 18 楼 mathe 的回复:]
引用 10 楼 litaoye 的回复:
嘿嘿,得了91060分,应该是最高分了!

http://wanwan.sina.com.cn/xyx/iplay.php?id=106359

发现输错了一次就要全部重来,最高分还是不容易产生的
[/Quote]
Sunday 2011-05-13
  • 打赏
  • 举报
回复
这个要用到“最大-最小搜索算法”,或者说 Alpha-Beta 剪枝算法,google一下,
我上次的课程设计就是黑白其游戏,整了三周时间,主要是算法+游戏规则
mathe 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 litaoye 的回复:]
嘿嘿,得了91060分,应该是最高分了!

http://wanwan.sina.com.cn/xyx/iplay.php?id=106359
[/Quote]
发现输错了一次就要全部重来,最高分还是不容易产生的
mathe 2011-05-13
  • 打赏
  • 举报
回复
的确原先代码有Bug,找Bug花了不少时间,然后顺便将代码改成支持任意矩形形状。
现在应该没有问题了
xiaoxiami002 2011-05-12
  • 打赏
  • 举报
回复
我还有个疑问:我们暂且把问题看成,每个元素都有两个值,0或者1,遍历所有的情况。
显然用以上BFS遍历的方法是可行的。
我的疑问来了:在原问题中当改变一个元素的值时,它旁边的元素也会变,难道这不会有影响吗。

纠结了几天了。。。。。
mathe 2011-05-12
  • 打赏
  • 举报
回复
这个可以通过在二阶域上解方程求解,这样效率要更高:
查看:关灯游戏
xiaoxiami002 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 litaoye 的回复:]
嘿嘿,得了91060分,应该是最高分了!

http://wanwan.sina.com.cn/xyx/iplay.php?id=106359
[/Quote]

你牛逼。。。。。
绿色夹克衫 2011-05-12
  • 打赏
  • 举报
回复
嘿嘿,得了91060分,应该是最高分了!

http://wanwan.sina.com.cn/xyx/iplay.php?id=106359

加载更多回复(8)

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧