分治法解决棋盘覆盖
2017-10-12 01:51
337 查看
L型骨牌覆盖棋盘:
问题描述:
在一个2k×2k 个方格组成的棋盘中,有一个方格与其它不同,称该方格为特殊方格,且称该棋盘为一特殊棋盘。棋盘覆盖问题如下:要求用图示的4种L形态骨牌覆盖给定的特殊棋盘限制条件:覆盖给定特殊棋盘上除特殊方格(红色)以外的所有方格限制条件:任何2个L型骨牌不得重叠覆盖解决思路:
1:必须在一个2k×2k 个方格组成的棋盘中,那是因为只有是2的k次方才能用四种L形骨牌完全覆盖(除去特殊方块)。2:在2k×2k 的棋盘中,可以将其平均分为4份,正如上图中那样。3:按照第二步进行递直到分为1*1的棋盘,此时有 if(size==1) return;代码:
tr:棋盘左上角的行号tc:棋盘左上角的列号 dr:特殊方格左上角的行号dc:特殊方格左上角的列号 size:棋盘规格(边长)运行结果:
说明:
2k1: 0是特殊方格所在的位置2: 在任何一个2k×2k 的棋盘中用到L型骨牌的个数为(4^k-1)/3#include "stdafx.h"#include <iostream>#include <iomanip>using namespace std;int Board[8][8];//8*8棋盘int tile=1; //骨牌编号 从1开始void CheesBoard(int tr,int tc,int dr,int dc,int size);int _tmain(int argc, _TCHAR* argv[]){CheesBoard(0,0,4,6,8);for(int i=0;i<8;i++){for(int j=0;j<8;j++){cout<<setw(3)<<Board[i][j];}cout<<endl;}int a;cin>>a;return 0;}void CheesBoard(int tr,int tc,int dr,int dc,int size){if(size==1) return;int t=tile++;//L型骨牌编号int s=size/2;//分割棋盘//操作左上角子棋盘if(dr<tr+s&&dc<tc+s){//如果特殊方格在此棋盘中CheesBoard(tr,tc,dr,dc,s);}else{//特殊方格不在此棋盘中Board[tr+s-1][tc+s-1]=t; //用编号为t的骨牌覆盖右下角CheesBoard(tr,tc,tr+s-1,tc+s-1,s);//操作其余方格}//操作右上角子棋盘if(dr<tr+s&&dc>=tc+s){//如果特殊方格在此棋盘中CheesBoard(tr,tc+s,dr,dc,s);}else{//特殊方格不在此棋盘中Board[tr+s-1][tc+s]=t;//用编号为t的骨牌覆盖左下角CheesBoard(tr,tc+s,tr+s-1,tc+s,s); //操作其余方格}//操作左下角子棋盘if(dr>=tr+s&&dc<tc+s){//如果特殊方格在此棋盘中CheesBoard(tr+s,tc,dr,dc,s);}else{//特殊方格不在此棋盘中Board[tr+s][tc+s-1]=t;//用编号为t的骨牌覆盖右上角CheesBoard(tr+s,tc,tr+s,tc+s-1,s);//操作其余方格}//操作右下角子棋盘if(dr>=tr+s&&dc>=tc+s){//如果特殊方格在此棋盘中CheesBoard(tr+s,tc+s,dr,dc,s);}else{//特殊方格不在此棋盘中Board[tr+s][tc+s]=t;//用编号为t的骨牌覆盖左上角CheesBoard(tr+s,tc+s,tr+s,tc+s,s);//操作其余方格}}
运行结果:
说明:
2k1: 0是特殊方格所在的位置2: 在任何一个2k×2k 的棋盘中用到L型骨牌的个数为(4^k-1)/3相关文章推荐
- 棋盘覆盖问题 - 分治法(c++)
- 算法07:棋盘覆盖——分治法Part3
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 递归分治解决棋盘覆盖问题
- 对棋盘完美覆盖问题证明过程的质疑及其解决(续)
- js算法:分治法-棋盘覆盖
- 分治法——棋盘覆盖问题
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 分治法:棋盘覆盖
- 分治法:棋盘覆盖问题
- 用Java解决棋盘覆盖问题
- c++解决棋盘覆盖问题
- 对棋盘完美覆盖问题证明过程的质疑及其解决
- 棋盘覆盖问题 分治法
- 03算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- c++解决棋盘覆盖问题
- 分治法实现棋盘覆盖C++
- 递归分治策略——Java之棋盘覆盖问题解决
- java解决棋盘覆盖问题
- java解决棋盘覆盖问题