Files
2025-09-13 22:37:17 +08:00

57 lines
1.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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";
}
}