棋盘覆盖
#include<iostream>
#include<vector>
#include <algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
int num = 0;//L型骨牌号
vector<vector<int>> board;
void chessboard(int tr, int tc, int dr, int dc, int size) {
if (size == 1) {
return;
}
int t = num++;//将第num号骨牌放在棋盘
int s = size / 2;
if (dr < tr + s && dc < tc + s) {//在棋盘左上角
chessboard(tr, tc, dr, dc, s);//规模缩小一半
}
else {
board[tr + s - 1][tc + s - 1] = t;//将右下角的标记,并把它当成特殊骨牌,递归调用
chessboard(tr, tc, tr + s - 1, tc + s - 1, s);
}
if (dr < tr + s && dc >= tc + s) {//在右上角
chessboard(tr, tc + s, dr, dc, s);
}
else {
board[tr + s - 1][tc + s] = t;
chessboard(tr, tc + s, tr + s - 1, tc + s, s);
}
if (dr >= tr + s && dc < tc + s)
{
chessboard(tr + s, tc, dr, dc, s);
}
else
{
board[tr + s][tc + s - 1] = t;
chessboard(tr + s, tc, tr + s, tc + s - 1, s);
}
if (dr >= tr + s && dc >= tc + s)
{
chessboard(tr + s, tc + s, dr, dc, s);
}
else
{
board[tr + s][tc + s] = t;
chessboard(tr + s, tc + s, tr + s, tc + s, s);
}
}
int main() {
int dr, dc;//特殊棋子的位置
int tr, tc;//棋盘左上角起始位置
int size;//棋盘大小
cout << "请输入棋盘大小2^k*2^k中的k:" << endl;
cin >> size;
size = pow(2, size);
cout << "请输入特殊棋子的行号和列号(0 - 2^k-1),用空格隔开:" << endl;
cin >> dr;
cin >> dc;
for (int i = 0; i < size ; i++) {
vector<int> a;
board.push_back(a);
for (int j = 0; j < size ; j++) {
board[i].push_back(-1); //把棋盘初始化,且所有位置为-1
}
}
chessboard(0, 0, dr, dc, size);
cout << "覆盖后棋盘如下:" << endl;
for (auto x : board) {
for (auto y : x) {
cout << left << setw(3) << y ;
}
cout<<endl;
}
}