残缺棋盘
2016-08-02 13:49
253 查看
残缺棋盘
给出一个棋盘,棋盘大小是2^k,k为正数,然后给出一个点是坏点。
要求用硬纸板将棋盘填充,硬纸板的形状为单位长度是2的正方形,扣去任意一个单位。即存在四种硬纸板。
填充要求,硬纸板不能覆盖坏点,也不能重复覆盖。
解题思路
找到坏点所在象限,然后用硬纸板在棋盘中心覆盖,使其余的三个象限都有“坏点”(即将硬纸板看做坏点),这样四个象限所处理的问题就相同,也就是递归。
递归的出口就是当单位面积为四的时候,这时候必然有一个坏点,这时候将其余的用硬纸板填充即可。
传递参数是时候只需传递当前棋盘的左上角坐标,坏点坐标,当前棋盘的边长即可。
代码
给出一个棋盘,棋盘大小是2^k,k为正数,然后给出一个点是坏点。
要求用硬纸板将棋盘填充,硬纸板的形状为单位长度是2的正方形,扣去任意一个单位。即存在四种硬纸板。
填充要求,硬纸板不能覆盖坏点,也不能重复覆盖。
解题思路
找到坏点所在象限,然后用硬纸板在棋盘中心覆盖,使其余的三个象限都有“坏点”(即将硬纸板看做坏点),这样四个象限所处理的问题就相同,也就是递归。
递归的出口就是当单位面积为四的时候,这时候必然有一个坏点,这时候将其余的用硬纸板填充即可。
传递参数是时候只需传递当前棋盘的左上角坐标,坏点坐标,当前棋盘的边长即可。
代码
#include<stdio.h> int tile=1; int Board[512][512]; void TileBoard(int tr,int tc,int dr,int dc,int size) { //覆盖残缺棋盘 if(size==1) return; int t=tile++, //所使用的三格板的数目 s=size/2;//象限大小 //覆盖左上象限 if(dr TileBoard(tr,tc,dr,dc,s); else { //本象限中没有残缺方格, 把三格板t放在右下角 Board[tr+s-1][tc+s-1]=t; //覆盖其余部分 TileBoard(tr,tc,tr+s-1,tc+s-1,s); } //覆盖右上象限 if(dr=tc+s) //残缺方格位于本象限 TileBoard(tr,tc+s,dr,dc,s); else { //本象限中没有残缺方格, 把三格板t放在左下角 Board[tr+s-1][tc+s]=t; //覆盖其余部分 TileBoard(tr,tc+s,tr+s-1,tc+s,s); } //覆盖左下象限 if(dr>=tr+s&&dc TileBoard(tr+s,tc,dr,dc,s); else { //把三格板t放在右上角 Board[tr+s][tc+s-1]=t; //覆盖其余部分 TileBoard(tr+s,tc,tr+s,tc+s-1,s); } //覆盖右下象限 if(dr>=tr+s&&dc>=tc+s) //残缺方格位于本象限 TileBoard(tr+s,tc+s,dr,dc,s); else { //把三格板t放在左上角 Board[tr+s][tc+s]=t; //覆盖其余部分 TileBoard(tr+s,tc+s,tr+s,tc+s,s); } } void OutputBoard(int size) { int i; int j; for(i=0;i { for(j=0;j printf( "]", Board[i][j] ); printf( "\n" ); } } void main() { int k; printf("INPUT THE SIZE OF THE CHECKBOARD:"); scanf("%d",&k); printf("INPUT THE X:"); int x; scanf("%d",&x); printf("INPUT THE Y:"); int y; scanf("%d",&y); TileBoard( 0, 0, x, y, k); OutputBoard( k ); return 0; }
相关文章推荐
- 残缺棋盘 android实现颜色填充
- ZCMU-1639-残缺的棋盘
- 算法竞赛宝典 分治算法 残缺棋盘
- csuoj 1511: 残缺的棋盘
- CSU 1511 残缺的棋盘
- 【算法复习二】传统基本算法(分治----残缺棋盘问题)
- CSU 1511: 残缺的棋盘(BFS啊 )
- 残缺棋盘问题
- 【算法复习二】传统基本算法(分治----残缺棋盘问题)
- COJ 1511:残缺的棋盘
- 残缺棋盘
- CSUOJ 1511 残缺的棋盘(BFS)
- 残缺棋盘问题
- 残缺的棋盘
- 残缺棋盘
- 湖南省第十届大学生计算机程序设计竞赛1511: 残缺的棋盘
- ACM--BFS--残缺的棋盘--CUS 1511--第十届湖南省赛
- 残缺棋盘 【分治】
- 残缺的棋盘(dijkstra算法)
- CSU 1511 残缺的棋盘