#include <iostream>
using namespace std;
#define MAX 1024
int p[MAX][MAX];
int id=0;
void chessboard(int x,int y,int m,int n,int size){//m,n为奇异点坐标
if(size==1){
return ;
}
id++;
int s=size/2;
int t=id;
if(m<x+s&&n<y+s){ //奇异点在左上角的话
chessboard(x,y,m,n,s);
}else{//奇异点不再左上角
p[x+s-1][y+s-1]=t;
chessboard(x,y,x+s-1,y+s-1,s);
}
if(m<x+s&&n>=y+s){//奇异点在右上角
chessboard(x,y+s,m,n,s);
}else{
p[x+s-1][y+s]=t;
chessboard(x,y+s,x+s-1,y+s,s);
}
if(m>=x+s&&n<y+s){//如果奇异点在左下角
chessboard(x+s,y,m,n,s);
}else{
p[x+s][y+s-1]=t;
chessboard(x+s,y,x+s,y+s-1,s);
}
if(m>=x+s&&n>=y+s){//奇异点在右下角
chessboard(x+s,y+s,m,n,s);
}else{
p[x+s][y+s]=t;
chessboard(x+s,y+s,x+s,y+s,s);
}
}
int main(){
int m,n;//表示奇异点坐标
int size;//表示棋盘的大小
cout<<"请输入棋盘的大小:";
cin>>size;
cout<<"请输入奇异点坐标:";
cin>>m>>n;
int x,y;
x=y=1;
chessboard(x,y,m,n,size);//x,y代表左上角位置
for(int i=1;i<=size;i++){
for(int j=1;j<=size;j++){
cout.width(2);
cout<<p[i][j]<<" ";
if(j==size){
cout<<endl;
}
}
}
return 0;
}
实际上和骑士游历问题很相似,都十分简单。主要难点是分区的边界条件问题。