#include<iostream>
using namespace std;
int tile=0;//tile表示L型骨牌的编号
int Board[100][100]={0};//用一个二维整型数组Board表示棋盘,Board[0][0]是棋盘的左上角方格
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{//tr表示棋盘左上角方格的行号
//tc表示棋盘左上角方格的列号
//dr表示特殊方格所在的行号
//dc表示特殊方格所在的列号
//size=2的k次方,棋盘的规格为2的k次方*2的k次方
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;//下标从零开始,所以减1
//覆盖其余方格
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 argc, char* argv[])
{
int size;//棋盘的维数
int tr,tc;//棋盘左上角方格的行号与列号
int dr,dc;//特殊方格所在行号与列号
cout<<" 请输入棋盘的维数(注意维数必须为2的k次方 )"<<endl;
cin>>size;
cout<<"请输入棋盘左上角的方格的行号与列号"<<endl;
cin>>tr>>tc;
cout<<"请输入特殊方格所在的行号与列号"<<endl;
cin>>dr>>dc;
ChessBoard(tr,tc,dr,dc,size);
//输出棋盘
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
printf("%4d",Board[i][j]);
cout<<endl;
}
return 0;
}