欢迎光临散文网 会员登陆 & 注册

棋盘覆盖

2023-03-23 11:03 作者:任小蜩  | 我要投稿

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

}

}


棋盘覆盖的评论 (共 条)

分享到微博请遵守国家法律