#include<iostream>
using namespace std;
const int n = 8;
int tile = 0;
int board[n][n] ;
//棋盘的中心总为tr+s-1,tc+s-1 tr+s-1,tc+s tr+s,tc+s-1 tr+s,tc+s
//tr,tc为递归的启示位置
void chessBoard (int tr,int tc,int dr,int dc,int size)
{
if(size == 1){
return ;
}
int t = ++tile;//L型骨牌编号
int s = size/2;//分割棋盘
//覆盖左上角的棋盘
if(dr < tr + s && dc <tc + s){//特殊方格在此棋盘中
chessBoard(tr, tc , dr, dc, s);
}
else{
//此棋盘中无特殊方格
//用t号L型方格覆盖右下角
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{
//此棋盘中无特殊方格
//用t号L型方格覆盖左下角
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{
//此棋盘中无特殊方格
//用t号L型方格覆盖右上角
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{
//此棋盘中无特殊方格
//用t号L型方格覆盖左上角
board[tr+s][tc+s] = t;
chessBoard(tr+s,tc+s,tr+s,tc+s,s);//将这个棋盘的左上角作为“特殊格子”
}
}
int main()
{
int dr,dc;
dr = 5;
dc = 5;
chessBoard(0,0,dr,dc,n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<board[i][j]<<"\t";
}
cout<<endl<<endl;
}
}
棋盘覆盖问题
最新推荐文章于 2022-08-07 22:03:36 发布