下边是一个4X4的棋盘,红色为特殊棋盘。要使用分治算法,据需要把四个区(0,1,2,3)转化为含有特殊棋盘的区域。以棋盘中心为中点,将四周的四个棋盘覆盖,如果该区域和红色目标棋盘在同一个区域,将其去掉(因为已经有红色区域了)。这样就得到四个特殊棋盘,用分治就可以了。
3 | 3 | 2 | 2 |
3 | 3 | 2 | 2 |
1 | 1 | 0 | 0 |
1 | 1 | 0 | 0 |
vector<vector<int>> &map 用来存储整个原始棋盘。
int tr, int tc 棋盘的左上角的坐标(tr,tc)。
int dr, int dc, 特殊棋盘的坐标。
int size 棋盘的宽度。大小为2的n次方。
代码 : zone == 3 ? dr : tr + s - 1, zone == 3 ? dc : tc + s - 1
指的是特殊棋盘在区域3,该区域的特殊棋盘坐标就为(dr,dc)。如果不在区域3,
该区域的特殊棋盘坐标就为(tr + s - 1,tc + s - 1)
如果不考虑特殊棋盘的位置,即划分的四个特殊棋盘在四个中心,可以用以下代码分别处理四个区。
CheesBoard(vec, tr, tc, tr + s - 1, tc + s - 1, s); // zone=3
CheesBoard(vec, tr, tc + s, tr + s - 1, tc + s, s); // zone=2
CheesBoard(vec, tr + s, tc, tr + s, tc + s - 1, s); // zone=1
CheesBoard(vec, tr + s, tc + s, tr + s, tc + s, s); // zone=0
考虑四个特殊棋盘中存在的原始特殊棋盘(dr,dc),在哪个区就将int dr, int dc所代表的坐标替换为
(dr,dc),完整代码如:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int m = 0; //用于简单标记L形区域。
void CheesBoard(vector<vector<int>> &map, int tr, int tc, int dr, int dc, int size)
{
if (size < 2)
return;
m++;
int s = size / 2, zone = 0;
//确定特殊棋盘所在位置(确定是四个区中的哪一个)
if (tr + s - 1 < dr && tc + s - 1 < dc)
zone = 0;
else if (tr + s - 1 < dr && tc + s - 1 >= dc)
zone = 1;
else if (tr + s - 1 >= dr && tc + s - 1 < dc)
zone = 2;
else if (tr + s - 1 >= dr && tc + s - 1 >= dc)
zone = 3;
//将特殊棋盘所在区以外的区域转化为特殊棋盘。
if (zone != 3)
map[tr + s - 1][tc + s - 1] = m;
if (zone != 2)
map[tr + s - 1][tc + s] = m;
if (zone != 1)
map[tr + s][tc + s - 1] = m;
if (zone != 0)
map[tr + s][tc + s] = m;
//覆盖棋盘。
CheesBoard(map, tr, tc, zone == 3 ? dr : tr + s - 1, zone == 3 ? dc : tc + s - 1, s);
CheesBoard(map, tr, tc + s, zone == 2 ? dr : tr + s - 1, zone == 2 ? dc : tc + s, s);
CheesBoard(map, tr + s, tc, zone == 1 ? dr : tr + s, zone == 1 ? dc : tc + s - 1, s);
CheesBoard(map, tr + s, tc + s, zone == 0 ? dr : tr + s, zone == 0 ? dc : tc + s, s);
}
int main()
{
int len = 8;
vector<vector<int>> arr(len);
for (int i = 0; i < arr.size(); i++)
arr[i].resize(len);
CheesBoard(arr, 0, 0, 1, 1, len);
ofstream file;
file.open("./index.txt");
for (int i = 0; i < arr.size(); i++)
{
for (int j = 0; j < arr[i].size(); j++)
{
file << arr[i][j] << "\t";
}
file << "\n";
}
return 0;
}