- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
河南理工大学计算机学院算法分析解题报告
棋盘覆盖问题
专业:软件工程.net 11-03班
学号:311109070314
姓名:李少伟
1 ?问题描述:
在-个2kX2k (k20)个方格组成的棋盘中,恰有-个方格 与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可 能岀现的位置有42种,因而有4k种不同的棋盘,下图所示是k=2 时16种棋盘中的一个。棋盘覆盖问题(chess cover problem)要求 用下图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以 外的所有方格,且任何2个L型骨牌不得重叠覆盖。
Q)k二2
Q)k二2时
田
(4种1骨牌
2.解题思路
关键技术:分治与递归
分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同, 并且每个子棋盘均包含一个特殊方格(这句话很重耍),从而将原问题 分解为规模较小的棋盘覆盖问题。先把原始棋盘划分成4个相等的棋 盘,由于棋盘只有一个特殊棋盘,所以这4个子棋盘中只有一个子棋 盘包含该特殊棋盘,以便采用递归的方法求解,可以用1一个L型骨 牌覆盖这3个较小棋盘的汇合处。从而将原问题转换为4个较小规模 的棋盘覆盖问题。递归使用这种划分策略,直至将棋盘分割为1*1的 子棋盘。
?解决方案
数据结构设计:
棋盘:可以一个二维数组board[size] [size]表示一个棋盘,
其中,size二2鼻。为了在递归处理的过程中使用同一个棋盘,将数
组board设置为全局变量
子棋盘:子棋盘由原始棋盘数组board的行下标列下标tc
特殊方格:用board [dr] [de]表示特殊方格,dr和de表示该特 殊方格的在二维数组board中的下标
L型骨牌:一个(2飞)* (2d)的棋盘中有一个特殊方格,所以用到L型骨牌的个数为(42 - 1) /3,将所有L型骨牌从1开始
连续编号,同一个骨牌有3个方格组成,这3个方格用同一个编号。
?源代码
〃问题描述:在一个27X22 (k^O)个方格组成的棋盘中,恰有…个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有47种,因而有4k种不同的棋盘,图4. 10(a)所示是k二2时16种棋盘中的一个。棋盘覆盖问题(chesscover problem)要求用下图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
〃解题思路:分治的技巧在于如何划分棋盘,使划分后的子 棋盘的大小相同,并且每个了棋盘均包含一个特殊方格(这句 话很重要),从而将原问题分解为规模较小的棋盘覆盖问题。 先把原始棋盘划分成4个相等的棋盘,由于棋盘只有一个特殊 棋盘,所以这4个子棋盘中只有一个子棋盘包含该特殊棋盘, 以便采用递归的方法求解,可以用1 一个L型骨牌覆盖这3个 较小棋盘的汇合处。从而将原问题转换为4个较小规模的棋盘 覆盖问题。递归使用这种划分策略,直至将棋盘分割为1*1的 子棋盘。
〃关键技术:分治与递归
〃开发语言:C++
〃运行环境:DEV-C++ 5
〃开发日期:2014年4月10日
#include stdio.h
#include stdlib.h
#define N 100
int board[N][N];
int t;
void ChessBoard(int tr, int tc, int dr, int de, int size)
int m,s;
if(size=l) return;
m=++t;
s=size/2;
if(drtr+sdctc+s)
chessboard(tr,tc,dr,dc,s);
else
{
board [tr+s-1 ] [tc+s-l]=m; chessboard(tr,tc,tr+s-1 ,tc+s? 1 ,s);
}
if(drtr+sdctc+s)
chessboard(tr,tc,dr,dc,s);
else
{
board [tr+s-1 ] [tc+s]=m;
chessboard(tr,tc,tr+s-1 ,tc+s,s);
}
if(drtr+sdcvtc+s)
chessboard(tr,tc,dr,dc,s);
else board [tr+s] [tc+s-l]=m;
chessboard(tr,tc,tr4-s,tc-t-s-l,s); }
if(drtr+sdctc+s)
chessboard(tr,tc,dr,dc,s);
else
{
board [tr+s] [tc+s]=m;
chessboard(tr,tc,tr+s,tc+s,s);
void print(int n)
{
int i,j;
for(i=0;ivn;i++) for (j=O;jvn;j++)
print
原创力文档


文档评论(0)