算法笔记(一)递归分治实例の棋盘覆盖问题

来源:互联网 发布:node 获取git版本号 编辑:程序博客网 时间:2024/05/21 08:58

问题描述如下:



每个棋盘都可以划分成四个部分,只有其中一个部分有黑块,为了继续递归,将其余三块靠近棋盘中心的顶点合成一个白色方格,继续递归,一直到size为2,按情况处理即可。

首先是打印一个最小单元

//////////////////////////////////////////////////////////////////////////// 打印一个白色方块(由三部分组成)//x,y 黑块在当前小棋盘的坐标信息//  nXOffset, nYOffset 当前棋盘在总棋盘中的偏移void PrintGrid(int x, int y, int nXOffset, int nYOffset);void PrintGrid(int x, int y, int nXOffset, int nYOffset){if (x == 0 && y == 0){cout<<"("<<nXOffset+1<<","<<nYOffset<<") ";cout<<"("<<nXOffset<<","<<nYOffset+1<<") ";cout<<"("<<nXOffset+1<<","<<nYOffset+1<<") ";cout<<endl;}else if (x == 0 && y == 1){cout<<"("<<nXOffset+1<<","<<nYOffset+1<<") ";cout<<"("<<nXOffset<<","<<nYOffset<<") ";cout<<"("<<nXOffset+1<<","<<nYOffset<<") ";cout<<endl;}else if (x == 1 && y == 0){cout<<"("<<nXOffset<<","<<nYOffset<<") ";cout<<"("<<nXOffset<<","<<nYOffset+1<<") ";cout<<"("<<nXOffset+1<<","<<nYOffset+1<<") ";cout<<endl;}else{cout<<"("<<nXOffset<<","<<nYOffset+1<<") ";cout<<"("<<nXOffset<<","<<nYOffset<<") ";cout<<"("<<nXOffset+1<<","<<nYOffset<<") ";cout<<endl;}}

然后是递归查找:

//////////////////////////////////////////////////////////////////////////// 找到棋盘中所有的白色方块//x,y 黑块在当前小棋盘中的坐标信息//  nXOffset, nYOffset 当前棋盘在总棋盘中的偏移//  size 当前棋盘的宽度void FindGrids(int x, int y, int size, int nXOffset, int nYOffset);void FindGrids(int x, int y, int size, int nXOffset, int nYOffset){// 处理出口if ( size == 2){PrintGrid(x*2/size, y*2/size, nXOffset, nYOffset);return;}// 打印中间的三角格FindGrids(x/2, y/2, 2, nXOffset+size/2-1, nYOffset+size/2-1);// 分治递归if (x*2/size == 1 && y*2/size == 1)// 黑点在右下{FindGrids(x-size/2, y-size/2, size/2, nXOffset+size/2, nYOffset+size/2);FindGrids(size/2-1, size/2-1, size/2, nXOffset, nYOffset);// 左上FindGrids(size/2-1, 0, size/2, nXOffset, nYOffset+size/2);// 左下FindGrids(0, size/2-1, size/2, nXOffset+size/2, nYOffset);// 右上}else if (x*2/size == 1 && y*2/size == 0)// 黑点在右上{FindGrids(x-size/2, y, size/2, nXOffset+size/2, nYOffset);FindGrids(size/2-1, size/2-1, size/2, nXOffset, nYOffset);// 左上FindGrids(size/2-1, 0, size/2, nXOffset, nYOffset+size/2);// 左下FindGrids(0, 0, size/2, nXOffset+size/2, nYOffset+size/2);// 右下}else if (x*2/size == 0 && y*2/size == 0)// 黑点在左上{FindGrids(x, y, size/2, nXOffset, nYOffset);FindGrids(size/2-1, 0, size/2, nXOffset, nYOffset+size/2);// 左下FindGrids(0, size/2-1, size/2, nXOffset+size/2, nYOffset);// 右上FindGrids(0, 0, size/2, nXOffset+size/2, nYOffset+size/2);// 右下}else// 黑点在左下{FindGrids(x, y-size/2, size/2, nXOffset, nYOffset+size/2);FindGrids(size/2-1, size/2-1, size/2, nXOffset, nYOffset);// 左上FindGrids(0, size/2-1, size/2, nXOffset+size/2, nYOffset);// 右上FindGrids(0, 0, size/2, nXOffset+size/2, nYOffset+size/2);// 右下}}

最后是main函数中调用:

#include <iostream>#include <math.h>using namespace std;void main(){int k,x,y;cout<<"请输入规模k,棋盘大小为2^k * 2^k:";cin>>k;cout<<"请输入黑格横坐标x:";cin>>x;cout<<"请输入黑格纵坐标y:";cin>>y;FindGrids(x, y, pow(2.f, k), 0, 0);}

代码写的不太好,有值得改善地方。

0 0
原创粉丝点击