一、Dancing Links:完全覆盖算法

来源:互联网 发布:看不见的客人 知乎 编辑:程序博客网 时间:2024/05/19 05:02


精髓在于:

1、问题转化。将二维问题转化为一维问题,了不得!

2、用位图来表示中间结果,节约了内存,不过运算效率的提高是其更大的优势!



转载自:

http://bbs.csdn.net/topics/190155444

1 问题描述
考虑一张棋盘,被分成6×6(6行6列)的36个正方形。设有形状一样的多米诺牌,每张牌恰好覆盖棋盘上相邻的两个方格。若把18张多米诺牌摆放在棋盘上,任何两张多米诺牌均不重叠,每张多米诺牌覆盖两个方格,并且棋盘上的所有的方格均被覆盖住,这样一种排列称为多米诺牌的完美覆盖。请问:6×6的棋盘有多少种不同的完美覆盖?
2 功能要求
1) 良好的用户界面。要求能够显示所有的完美覆盖。
2) 合适的算法。可以采用多种算法,并从空间复杂度和时间复杂度两方面进行比较。
3) 最终的结果保存在一个文本文件中。将6*6棋盘上的位置作如下编号:
_________________________
| 1 | 2 | 3 | 4 | 5 | 6 |
_________________________
| 7 | 8 | 9 | 10| 11| 12|
_________________________
| 13| 14| 15| 16| 17| 18|
_________________________
| 19| 20| 21| 22| 23| 24|
_________________________
| 25| 26| 27| 28| 29| 30|
_________________________
| 31| 32| 33| 34| 35| 36|
_________________________

任意一块骨牌在棋盘上的摆放都可以用一串长度为36的0、1序列来表示,比如
110000000000000000000000000000000000——>表示在棋盘最左上角的位置横着摆上一块骨牌。
考虑到骨牌既可以横着摆也可以竖着摆,一块骨牌在棋盘上的摆放共有2*5*6=60种情况.
这样就可以得到一个60*36大小的矩阵,不妨将该矩阵记为A。矩阵中的元素由0和1组成,矩阵中的每一行都有且只有两个1。
于是上述问题,就转换成怎样从矩阵中找出18行,抽取出来的这18行构成的新的18*36的矩阵,如果能满足每列中有且只有一个1,那么它就是一个完美覆盖。

将6*6棋盘上的位置作如下编号:
_________________________
| 1 | 2 | 3 | 4 | 5 | 6 |
_________________________
| 7 | 8 | 9 | 10| 11| 12|
_________________________
| 13| 14| 15| 16| 17| 18|
_________________________
| 19| 20| 21| 22| 23| 24|
_________________________
| 25| 26| 27| 28| 29| 30|
_________________________
| 31| 32| 33| 34| 35| 36|
_________________________

任意一块骨牌在棋盘上的摆放都可以用一串长度为36的0、1序列来表示,比如
110000000000000000000000000000000000——>表示在棋盘最左上角的位置横着摆上一块骨牌。
考虑到骨牌既可以横着摆也可以竖着摆,一块骨牌在棋盘上的摆放共有2*5*6=60种情况.
这样就可以得到一个60*36大小的矩阵,不妨将该矩阵记为A。矩阵中的元素由0和1组成,矩阵中的每一行都有且只有两个1。
于是上述问题,就转换成怎样从矩阵中找出18行,抽取出来的这18行构成的新的18*36的矩阵,如果能满足每列中有且只有一个1,那么它就是一个完美覆盖。

0 0
原创粉丝点击