第一范文网 - 专业文章范例文档资料分享平台

用分治法求解棋盘覆盖问题

来源:用户分享 时间:2020-06-30 本文由沧月哀荒 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

棋盘覆盖问题

问题描述:

在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格

为特殊方格。显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘,图(a)所示是k=2时16种棋盘中的一个。棋盘覆盖问题要求用图(b)所示的4中不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且热河亮哥L型骨牌不得重复覆盖。 图(b)

图 (a) 问题分析:

K>0时,可将2k×2k的棋盘划分为4个2k-1×2k-1的子棋盘。这样划分后,由于原棋盘只

有一个特殊方格,所以,这4个子棋盘中只有1个子棋盘中有特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化成为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3个较小的棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。 问题求解:

下面介绍棋盘覆盖问题中数据结构的设计。

(1) 棋盘:可以用一个二维数组board[size][size]表示一个棋盘,其中size=2k。为了

在递归处理的过程中使用同一个棋盘,将数组board设为全局变量。

(2) 子棋盘:整个棋盘用二维数组board[size][size]表示,其中的子棋盘由棋盘左上

角的下标tr、tc和棋盘大小s表示。

(3) 特殊方格:用board[dr][dc]表示特殊方格,dr和dc是该特殊方格在二维数组

board中的下标。

(4) L型骨牌:一个2k×2k的棋盘中有一个特殊方格,所以,用到L型骨牌的个数

为(4k-1)/3,将所有L型骨牌从1开始连续编号,用一个全局变量tile表示。

C语言源码: /*author: 彭洪伟

*studentID:0950310006 *class:计科1班

*problem:分治法解决棋盘覆盖问题 */

#include #include

int tile=1; //记录骨牌的型号

int board[20][20]={0}; //存储棋盘被覆盖的情况

void ChessBoard(int tr,int tc,int dr,int dc,int size)

{ //tr和tc是棋盘左上角的下标,dr和dc是特殊方格的下标,size是棋盘的大小 int t=0; int s; if (size==1)return; t=tile++; s=size/2; //划分棋盘 //覆盖左上角棋盘 if (dr=tc+s) //特殊方格在棋盘的右上角 ChessBoard(tr,tc+s,dr,dc,s); else { board[tr+s-1][tc+s]=t; ChessBoard(tr,tc+s,tr+s-1,tc+s,s); } //覆盖左下角棋盘 if (dr>=tr+s&&dc

board[tr+s][tc+s-1]=t; 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; ChessBoard(tr+s,tc+s,tr+s,tc+s,s); } }

int main() { int k,x,y; printf(\请输入棋盘的规模K:\ scanf(\ printf(\请输入特殊方格的下标x,y:\ scanf(\ ChessBoard(0,0,x,y,pow(2,k)); for(int i=0; i

运行结果截图:

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新教学研究用分治法求解棋盘覆盖问题 全文阅读和word下载服务。

用分治法求解棋盘覆盖问题 .doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1107642.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top