一、Dancing Links:完全覆盖算法
2014-06-08 21:34
573 查看
精髓在于:
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,那么它就是一个完美覆盖。
精髓在于:
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,那么它就是一个完美覆盖。
相关文章推荐
- HUST 1017 Exact cover(Dancing Links 精确覆盖)
- dancing links 算法 解 Sudoku
- [转] 舞蹈链(Dancing Links)——求解精确覆盖问题
- HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
- dancing links精确覆盖模版
- HDU 3335 Divisibility dancing links 重复覆盖
- Dancing Links + A* 应用于精确覆盖、重复覆盖
- HDU 3663 Power Stations(Dancing_Links精确覆盖)
- HUST_1017_ExactCover(DancingLinksX精确覆盖模板题)
- HDU5046 Airport dancing links 重复覆盖+二分
- Dancing Links 精确覆盖问题的快速dfs
- HDU 5046 Airport ( Dancing Links 反复覆盖 )
- DANCING LINKS解决重复覆盖问题
- POJ 3074 SUKODU [Dancing Links DLX精准覆盖问题]
- POJ3740-精确覆盖,Dancing_links
- DLX舞蹈链(Dancing Links)——求解精确覆盖问题
- HDU 2295 Radar dancing links 重复覆盖
- 精确覆盖问题的dancing links 技术
- GUI程序优化算法之矩形覆盖
- FZU_1686_神龙的难题(DancingLinksX重复覆盖)