#include #include using namespace std; int tile = 1; // 用于标记不同骨牌编号 void cover(vector>& 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<> board(n, vector(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"; } }