1 #include <iostream.h>
2 constint size=4;
3 int board[4][4];
4
5 void ChessBoard(int tr,int tc,int dr,int dc,int size){
6 int s;
7 if(size==1)
8 return;
9 staticint k=0;//定义一个静态的变量 记录L骨牌号
10 int t=++k;//
11 s=size/2;
12 if(dr<tr+s&&dc<tc+s)//特殊方格在左上角子棋盘
13 ChessBoard(tr,tc,dr,dc,s);//递归吃力子棋盘
14 else{
15 board[tr+s-1][tc+s-1]=t;//标记 在左上角棋盘的最右下角设定一个特殊方格
16 ChessBoard(tr,tc,tr+s-1,tc+s-1,s);//重新递归遍历
17 }
18
19 if(dr<tr+s&&dc>=tc+s)//右上角
20 ChessBoard(tr,tc+s,dr,dc,s);
21 else{
22 board[tr+s-1][tc+s]=t;//标记 在左上角棋盘的最左下角设定一个特殊方格
23 ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
24 }
25
26 if(dr>=tr+s&&dc<tc+s)//左下角
27 ChessBoard(tr+s,tc,dr,dc,s);//标记 在左上角棋盘的最右上角设定一个特殊方格
28 else{
29 board[tr+s][tc+s-1]=t;
30 ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
31 }
32
33 if(dr>=tr+s&&dc>=tc+s)//右下角
34 ChessBoard(tr+s,tc+s,dr,dc,s);//标记 在左上角棋盘的最左上角设定一个特殊方格
35 else{
36 board[tr+s][tc+s]=t;
37 ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
38 }
39 }
40
41 void print(int size){
42 for(int i=0;i<size;i++){
43 for(int j=0;j<size;j++)
44 cout<<board[i][j]<<"";
45 cout<<endl;}
46 }
47
48 void main(){
49 board[2][1]=0;
50 ChessBoard(0,0,2,1,size);
51 print(4);
52 }
2 constint size=4;
3 int board[4][4];
4
5 void ChessBoard(int tr,int tc,int dr,int dc,int size){
6 int s;
7 if(size==1)
8 return;
9 staticint k=0;//定义一个静态的变量 记录L骨牌号
10 int t=++k;//
11 s=size/2;
12 if(dr<tr+s&&dc<tc+s)//特殊方格在左上角子棋盘
13 ChessBoard(tr,tc,dr,dc,s);//递归吃力子棋盘
14 else{
15 board[tr+s-1][tc+s-1]=t;//标记 在左上角棋盘的最右下角设定一个特殊方格
16 ChessBoard(tr,tc,tr+s-1,tc+s-1,s);//重新递归遍历
17 }
18
19 if(dr<tr+s&&dc>=tc+s)//右上角
20 ChessBoard(tr,tc+s,dr,dc,s);
21 else{
22 board[tr+s-1][tc+s]=t;//标记 在左上角棋盘的最左下角设定一个特殊方格
23 ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
24 }
25
26 if(dr>=tr+s&&dc<tc+s)//左下角
27 ChessBoard(tr+s,tc,dr,dc,s);//标记 在左上角棋盘的最右上角设定一个特殊方格
28 else{
29 board[tr+s][tc+s-1]=t;
30 ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
31 }
32
33 if(dr>=tr+s&&dc>=tc+s)//右下角
34 ChessBoard(tr+s,tc+s,dr,dc,s);//标记 在左上角棋盘的最左上角设定一个特殊方格
35 else{
36 board[tr+s][tc+s]=t;
37 ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
38 }
39 }
40
41 void print(int size){
42 for(int i=0;i<size;i++){
43 for(int j=0;j<size;j++)
44 cout<<board[i][j]<<"";
45 cout<<endl;}
46 }
47
48 void main(){
49 board[2][1]=0;
50 ChessBoard(0,0,2,1,size);
51 print(4);
52 }
其实这个算法很好理解,是一个典型的分治法。。
刚开始在第9和第10行时,发生了一个错误,我也不理解。。就是直接用静态变量k++,而没有把k++赋值给t,这样虽可以编译,但是会出现错误。。
下面是程序用到原理图
对不存在特殊方格的子棋盘进行处理