算法实现(6)棋盘覆盖
2015-06-01 20:12
260 查看
在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。
特殊方格必位于4个较小棋盘之一中,其余3个没有特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。
在构造剩下没特殊方格三个子棋盘时,我们也是在他们中的也假一个方格设为特殊方格。如果是:
左上的子棋盘(若不存在特殊方格)则将该子棋盘右下角的那个方格假设为特殊方格
右上的子棋盘(若不存在特殊方格)则将该子棋盘左下角的那个方格假设为特殊方格
左下的子棋盘(若不存在特殊方格)则将该子棋盘右上角的那个方格假设为特殊方格
右下的子棋盘(若不存在特殊方格)则将该子棋盘左上角的那个方格假设为特殊方格
tc:棋盘左上角方格的列号
dr:特殊方格所在的行号
dc:特殊方格所在的列号
size:棋盘的规格2k×2k
复杂度分析
当k>0时,每一次都分成4个比它小一个规模的子棋盘,所以有T(k) = 4T(k-1)
当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。
特殊方格必位于4个较小棋盘之一中,其余3个没有特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。
在构造剩下没特殊方格三个子棋盘时,我们也是在他们中的也假一个方格设为特殊方格。如果是:
左上的子棋盘(若不存在特殊方格)则将该子棋盘右下角的那个方格假设为特殊方格
右上的子棋盘(若不存在特殊方格)则将该子棋盘左下角的那个方格假设为特殊方格
左下的子棋盘(若不存在特殊方格)则将该子棋盘右上角的那个方格假设为特殊方格
右下的子棋盘(若不存在特殊方格)则将该子棋盘左上角的那个方格假设为特殊方格
void chessBoard(int tr, int tc, int dr, int dc, int size) { if (size == 1) return; int t = tile++, // L型骨牌号 s = size/2; // 分割棋盘 //覆盖左上角子棋盘 if (dr < tr + s && dc < tc + s) // 特殊方格在此棋盘中 chessBoard(tr, tc, dr, dc, s); else {// 特殊方格不在此棋盘中 board[tr + s - 1][tc + s - 1] = t; //用t号L型骨牌覆盖右下角 // 覆盖其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s);} //覆盖右上角子棋盘 if (dr < tr + s && dc >= tc + s) // 特殊方格在此棋盘中 chessBoard(tr, tc+s, dr, dc, s); else { board[tr + s - 1][tc + s] = t;//用t号L型骨牌覆盖左下角 // 覆盖其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s);} //覆盖左下角子棋盘 if (dr >= tr + s && dc < tc + s) chessBoard(tr+s, tc, dr, dc, s); // 特殊方格在此棋盘中 else {// 特殊方格不在此棋盘中 board[tr + s][tc + s - 1] = t;//用t号L型骨牌覆盖右上角 chessBoard(tr+s, tc, tr+s, tc+s-1, s);} // 覆盖其余方格 //覆盖右下角子棋盘 if (dr >= tr + s && dc >= tc + s) chessBoard(tr+s, tc+s, dr, dc, s);// 特殊方格在此棋盘中 else {// 特殊方格不在此棋盘中 board[tr + s][tc + s] = t;//用t号L型骨牌覆盖左上角 chessBoard(tr+s, tc+s, tr+s, tc+s, s);}// 覆盖其余方格 }tr:棋盘左上角方格的行号
tc:棋盘左上角方格的列号
dr:特殊方格所在的行号
dc:特殊方格所在的列号
size:棋盘的规格2k×2k
复杂度分析
当k>0时,每一次都分成4个比它小一个规模的子棋盘,所以有T(k) = 4T(k-1)
相关文章推荐
- mysql启动和关闭外键约束的方法
- Microsoft.Office.Interop.Excel 操作 Excel
- Zookeeper开源客户端框架Curator简介
- STL之multimap
- 020_01UI组件之Dialog详细用法
- 集合框架(一) 层次体系结构
- JavaScript-break 语句用于跳出循环
- FTP服务器安装
- Kafka replication
- quick-cocos2d 之动态更新
- Git on ubuntu
- 马化腾:创业早期为拉用户,曾假扮女孩陪聊
- 线程
- Leetcode Contains Duplicate
- Html-Css-设置DIV边框圆滑
- JDK 安装
- zookeeper原理
- cdoj 04 Complete Building the Houses 暴力
- 第十三周阅读程序3:纯虚函数
- 微信学习笔记之四(媒体文件的上传与下载)