求NOIP2007普及组初赛试题(棋盘覆盖问题)的程序解析,比如程序的思路以及每步的作用

求NOIP2007普及组初赛试题(棋盘覆盖问题)的程序解析,比如程序的思路以及每步的作用,第1张

声明:本文使用的代码和例子的来源:《计算机算法设计与分析》(王晓东编著,电子工业出版社)。我对代码做了少许修改,使可以在tc的图形模式下看到题目的结果。

题目:在一个(2^k)*(2^k)个方格组成的棋盘上,有一个特殊方格与其他方格不同,称为特殊方格,称这样的棋盘为一个特殊棋盘。现在要求对棋盘的其余部分用L型方块填满(注:L型方块由3个单元格组成。即围棋中比较忌讳的愚形三角,方向随意),切任何两个L型方块不能重叠覆盖。L型方块的形态如下:

■■*■■***■*■

■******■*■■*■■

题目的解法使用分治法,即子问题和整体问题具有相同的形式。我们对棋盘做一个分割,切割一次后的棋盘如图1所示,我们可以看到棋盘被切成4个一样大小的子棋盘,特殊方块必定位于四个子棋盘中的一个。假设如图1所示,特殊方格位于右上角,我们把一个L型方块(灰色填充)放到图中位置。这样对于每个子棋盘又各有一个“特殊方块”,我们对每个子棋盘继续这样分割,知道子棋盘的大小为1为止。

用到的L型方块需要(4^k-1)/3 个,算法的时间是O(4^k),是渐进最优解法。

首先在Eclipse中创建一个Java程序,然后在src下面添加三个包,分别为bin.image(主要用来存放图片资源),org.wzq(主要用来存放五子棋的游戏程序),org.work(主要用来存放主程序)。然后在org.work新建一个包含main函数Main类;在org.wzq新建一个Wzqclass类,同时让它继承自JFrame类,实现MouseListener, Runnable两个接口,不包含main函数。

int t=++tile这个tile是什么定义?通篇都没有见到啊~

Board[tr+s-1][tc+s-1]=tBoard是什么函数,也没见到~

能不能把整个程序的语言放上来呢?

另外,我想说,用L型覆盖的话,每次四等分后,不一定能覆盖掉其中一块哦,你的L型是什么样的呢?3-1还是2-1?如果是3-1,那意味着边长是4的倍数才能简单覆盖哦~

看得我眼晕...目前看到一个小问题

//覆盖左上角棋盘

if(dr<tr+s &&dc<tc+s)

//特殊方格在此棋盘中

ChessBoard(tr,tc,dr,dc,s)

else{//此棋盘中无特殊方格,用T号L型骨牌覆盖右下角

Board[tr+s-1][tc+s-1]=t

//覆盖其余方格 <------------------------------------下面那句话有点问题啊,你以左上角最右下角的那个格子为特殊格再次chessboard了

ChessBoard(tr,tc,tr+s-1,tc+s-1,s)}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12051166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存