收藏 分享(赏)

棋盘覆盖问题.doc

上传人:j35w19 文档编号:6985870 上传时间:2019-04-29 格式:DOC 页数:11 大小:47KB
下载 相关 举报
棋盘覆盖问题.doc_第1页
第1页 / 共11页
棋盘覆盖问题.doc_第2页
第2页 / 共11页
棋盘覆盖问题.doc_第3页
第3页 / 共11页
棋盘覆盖问题.doc_第4页
第4页 / 共11页
棋盘覆盖问题.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、分治法棋盘覆盖声明:本文使用的代码和例子的来源:计算机算法设计与分析(王晓东编著,电子工业出版社)。我对代码做了少许修改,使可以在 tc 的图形模式下看到题目的结果。题目:在一个(2k)*(2k)个方格组成的棋盘上,有一个特殊方格与其他方格不同,称为特殊方格,称这样的棋盘为一个特殊棋盘。现在要求对棋盘的其余部分用 L 型方块填满(注:L 型方块由 3 个单元格组成。即围棋中比较忌讳的愚形三角,方向随意),切任何两个 L型方块不能重叠覆盖。 L 型方块的形态如下: , , , 题目的解法使用分治法,即子问题和整体问题具有相同的形式。我们对棋盘做一个分割,切割一次后的棋盘如图 1 所示,我们可以看

2、到棋盘被切成 4 个一样大小的子棋盘,特殊方块必定位于四个子棋盘中的一个。假设如图 1 所示,特殊方格位于右上角,我们把一个 L型方块(灰色填充)放到图中位置。这样对于每个子棋盘又各有一个“ 特殊方块”,我们对每个子棋盘继续这样分割,知道子棋盘的大小为 1 为止。用到的 L 型方块需要( 4k-1)/3 个,算法的时间是 O(4k),是渐进最优解法。本题目的 C 语言的完整代码如下( TC2.0 下调试),运行时,先输入 k 的大小,(1,编译时会出现错误。 #include #include /*#include */#define N 64#define BoardLeft 2#defin

3、e BoardTop 2int BoardNN; /*棋盘*/int tile;/*全局性质的 L 图形编号*/int CellSize=10;/*网格大小*/int BorderColor=LIGHTGRAY;/*用指定颜色填充一个单元格!*/void PutCell(int x,int y,int color)setfillstyle(SOLID_FILL,color);rectangle(BoardLeft+x*CellSize,BoardTop+y*CellSize,BoardLeft+(x+1)*CellSize,BoardTop+(y+1)*CellSize);floodfill(

4、BoardLeft+x*CellSize+CellSize/2,BoardTop+y*CellSize+CellSize/2,BorderColor);/*绘制 L 方块,(cx,cy)是 L 方块的中心点 CELL 坐标,pos 从 1 到 4,表示位于特殊方块位于哪个角(即缺失的一角位置)*/void PutBlock(int cx,int cy,int pos)int x,y,t=CellSize;/*方块起始点像素坐标*/x=BoardLeft+cx*CellSize;y=BoardTop+cy*CellSize;moveto(x,y);/*移动到中心点*/switch(pos)cas

5、e 1:/*左上角缺*/lineto(x,y-t);lineto(x+t,y-t);lineto(x+t,y+t);lineto(x-t,y+t);lineto(x-t,y);break;case 2:/*右上角缺*/lineto(x+t,y);lineto(x+t,y+t);lineto(x-t,y+t);lineto(x-t,y-t);lineto(x,y-t);break;case 3:/*左下角缺*/lineto(x-t,y);lineto(x-t,y-t);lineto(x+t,y-t);lineto(x+t,y+t);lineto(x,y+t);break;case 4:/*右下角

6、缺*/lineto(x,y+t);lineto(x-t,y+t);lineto(x-t,y-t);lineto(x+t,y-t);lineto(x+t,y);break;lineto(x,y);/*回到闭合点!*/*初始化图形模式*/void InitGraph()int gdriver=DETECT,gmode;initgraph(setcolor(BorderColor);/*关闭图形模式*/void CloseGraph()closegraph();/*打印棋盘*/void PrintBoard(int size)int i,j;clrscr();for(j=0;j=left+s pos

7、=3;elseBoardleft+s-1top+s=t;ChessBoard(left,top+s,left+s-1,top+s-1,s);/*-处理右下角-*/if(x=left+s pos=4;elseBoardleft+stop+s=t;ChessBoard(left+s,top+s,left+s,top+s,s);/*画出当前的 L 方块*/PutBlock(left+s,top+s,pos);void main()int size,k,x,y,i,j;printf(“please input k=? (k should not more than 6, boardsize=2k ):

8、 n“);scanf(“%d“,size=16 | x(size-1) | y(size-1)printf(“Input invalid!n“);return;InitGraph();tile=1;Boardxy=0;/*绘制特殊方块!*/PutCell(x,y,RED);ChessBoard(0,0,x,y,size);/*CopyScreen(“c:tctempchess.bmp“,0,0,400,400);*/getch();CloseGraph();2.#include“stdio.h“ #include #include #include int tile=1; int avg; i

9、nt basex,basey; void chessboard(int tr,int tc,int dr,int dc,int size)/*加了一个 int tc*/ int s,t; if(size=1)return; t=tile+; s=size/2; delay(150000); setfillstyle(7,1); sound(500); delay(1500); sound(400); delay(1500); nosound(); bar(dr*avg+basex,dc*avg+basey,(dr+1)*avg+basex,(dc+1)*avg+basey); if(dr*av

10、g+basex)=tc+s*avg) chessboard(tr,tc+s*avg,dr,dc,s); else setfillstyle(1,t); bar(tr+(s-1)*avg,tc+s*avg,tr+s*avg,tc+(s+1)*avg);/*在这加了一个 tr+s*avg*/ chessboard(tr,tc+s*avg,(tr-basex)/avg+s-1,(tc-basey)/avg+s,s); if(dr*avg+basex)=tr+s*avg else setfillstyle(1,t); bar(tr+s*avg,tc+s*avg,tr+(s+1)*avg,tc+(s+1

11、)*avg); chessboard(tr+s*avg,tc+s*avg,(tr-basex)/avg+s,(tc-basey)/avg+s,s); main() int size,k; int dr,dc,tr,tc; int endx,endy; int i; double x,y; int gdriver=DETECT; int gmode=VGA; initgraph( basex=300,basey=100; endx=basex+320; endy=basey+320; cleardevice(); setcolor(12); settextstyle(2,0,8); outtex

12、txy(20,20,“zhoumingjiangn“);/*改成了 outtextxy 函数*/ outtextxy(60,60,“designer:zhoumingjiang 25/10/2002“); setbkcolor(BLACK); setcolor(RED); printf(“nnn“); printf(“ please input k: “); scanf(“%d“, x=2; y=k; size=pow(x,y); avg=320/size; rectangle(basex,basey,endx,endy); for(i=0;i#include #include int tit

13、le=1;int board6464;void chessBoard(int tr,int tc,int dr,int dc,int size)int s,t;if(size=1) return;t=title+;s=size/2;if(dr=tc+s)chessBoard(tr,tc+s,dr,dc,s);elseboardtr+s-1tc+s=t;chessBoard(tr,tc+s,tr+s-1,tc+s,s);if(dr=tr+s elseboardtr+stc+s=t;chessBoard(tr+s,tc+s,tr+s,tc+s,s);void main() int dr=0,dc=0,s=1,i=0,j=0;printf(“print in the size of chess:n“);scanf(“%d“,printf(“print in specal point x,y:n“);scanf(“%d%d“,if(drs for(i=0;is;i+)for(j=0;js;j+)printf(“%4d“,boardij);printf(“n“);elseprintf(“the wrong specal point!n“);getch();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报