57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
#include <iostream>
|
||
#include <vector>
|
||
using namespace std;
|
||
|
||
int tile = 1; // 用于标记不同骨牌编号
|
||
|
||
void cover(vector<vector<int>>& board, int top_x, int top_y, int defect_x, int defect_y, int size) {
|
||
if (size == 2) {
|
||
for (int i = 0; i < 2; ++i)
|
||
for (int j = 0; j < 2; ++j)
|
||
if (top_x+i != defect_x || top_y+j != defect_y)
|
||
board[top_x+i][top_y+j] = tile;
|
||
tile++;
|
||
return;
|
||
}
|
||
|
||
int mid = size/2;
|
||
int cx = top_x + mid;
|
||
int cy = top_y + mid;
|
||
|
||
// 判断缺格在哪个象限
|
||
int quadrant = 0;
|
||
if (defect_x < cx && defect_y < cy) quadrant = 0; // 左上
|
||
else if (defect_x < cx && defect_y >= cy) quadrant = 1; // 右上
|
||
else if (defect_x >= cx && defect_y < cy) quadrant = 2; // 左下
|
||
else quadrant = 3; // 右下
|
||
|
||
// 在中心放L型骨牌,覆盖3个非缺格象限的中心角
|
||
if (quadrant != 0) board[cx-1][cy-1] = tile;
|
||
if (quadrant != 1) board[cx-1][cy] = tile;
|
||
if (quadrant != 2) board[cx][cy-1] = tile;
|
||
if (quadrant != 3) board[cx][cy] = tile;
|
||
tile++;
|
||
|
||
// 递归四个子棋盘
|
||
cover(board, top_x, top_y, quadrant==0?defect_x:cx-1, quadrant==0?defect_y:cy-1, mid); // 左上
|
||
cover(board, top_x, top_y+mid, quadrant==1?defect_x:cx-1, quadrant==1?defect_y:cy, mid); // 右上
|
||
cover(board, top_x+mid, top_y, quadrant==2?defect_x:cx, quadrant==2?defect_y:cy-1, mid); // 左下
|
||
cover(board, top_x+mid, top_y+mid, quadrant==3?defect_x:cx, quadrant==3?defect_y:cy, mid); // 右下
|
||
}
|
||
|
||
int main() {
|
||
int k = 3; // 2^3 x 2^3 棋盘
|
||
int n = 1<<k;
|
||
vector<vector<int>> board(n, vector<int>(n, 0));
|
||
|
||
int defect_x = 2, defect_y = 3; // 缺格位置
|
||
cover(board, 0, 0, defect_x, defect_y, n);
|
||
|
||
// 输出棋盘
|
||
for (auto &row : board) {
|
||
for (auto &x : row) cout << x << "\t";
|
||
cout << "\n";
|
||
}
|
||
}
|
||
|