博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
棋盘覆盖问题(分治思想)
阅读量:5107 次
发布时间:2019-06-13

本文共 1398 字,大约阅读时间需要 4 分钟。

  在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四个L型骨牌如下图:

       棋盘中的特殊方格如图:

 

       实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图所示:

      棋盘覆盖程序如下:

#include 
using namespace std; int tile = 1;//全局变量 骨牌编号 int Board[4][4];//棋盘 void ChessBoard(int tr,int tc,int dr,int dc,int size); int main() { for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { Board[i][j] = 0; } } ChessBoard(0,0,2,3,4); for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { cout<
<<" "; } cout<
=tc+s)//特殊方格在此棋盘中 { ChessBoard(tr,tc+s,dr,dc,s); } else//特殊方格不在此棋盘中 { //用编号为t的骨牌覆盖左下角 Board[tr+s-1][tc+s] = t; //覆盖其余方格 ChessBoard(tr,tc+s,tr+s-1,tc+s,s); } //覆盖左下角子棋盘 if(dr>=tr+s && dc
=tr+s && dc>=tc+s)//特殊方格在此棋盘中 { ChessBoard(tr+s,tc+s,dr,dc,s); } else//特殊方格不在此棋盘中 { //用编号为t的骨牌覆盖左上角 Board[tr+s][tc+s] = t; //覆盖其余方格 ChessBoard(tr+s,tc+s,tr+s,tc+s,s); } }

 

 

 

 

      程序运行结果如下:

 

 

转载于:https://www.cnblogs.com/caiyishuai/p/8664775.html

你可能感兴趣的文章
HowTo:freeswitch在多网卡服务器下如何配置
查看>>
C语言中隐藏结构体定义的方法
查看>>
“父窗口拖动的时候Popup不随着父窗口移动”问题的解决方案
查看>>
Android源码:(一) 安卓2.1到4.4操作系统通用的Actionbar实现的tab导航例子。
查看>>
Ubuntu 下安装 CCNx0.8.2
查看>>
UVA-227 Puzzle(模拟)
查看>>
基于ruby的watir自动化测试 笔记一
查看>>
FTP服务器FileZilla Server配置及使用方法
查看>>
python radix算法实现
查看>>
globals和locals的区别
查看>>
delphi 动态数组
查看>>
JDK动态代理和CGLIB的区别
查看>>
js 日期证有效性验的通用方法
查看>>
PHP日常排错
查看>>
2142134
查看>>
【软件需求工程与建模 - 小组项目】第6周 - 成果展示3 - 软件设计规格说明书V4.1...
查看>>
Delphi子窗体随主窗体大小而变化
查看>>
JavaBean与xml互转的方法详解
查看>>
html中css三种常见的样式选择器
查看>>
AttributeError: 'dict' object has no attribute 'iteritems'
查看>>