C++棋盘覆盖

        下边是一个4X4的棋盘,红色为特殊棋盘。要使用分治算法,据需要把四个区(0,1,2,3)转化为含有特殊棋盘的区域。以棋盘中心为中点,将四周的四个棋盘覆盖,如果该区域和红色目标棋盘在同一个区域,将其去掉(因为已经有红色区域了)。这样就得到四个特殊棋盘,用分治就可以了。

3 3 2 2
3 3 2 2
1 1 0 0
1 1 0 0

vector> &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 
#include 
#include 
using namespace std;

int m = 0; //用于简单标记L形区域。

void CheesBoard(vector> &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> 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;
}

你可能感兴趣的:(c++,c++,算法)