将矩阵进行划分,使不存在特殊方格的3大块子矩阵构成再中心构成所要求的类型的图形(若不存在特殊格,设置特殊格并且赋值,左上 ->右下,右上->左下,左下->右上,右下->左上,然后递归)。
#include"iostream" using namespace std; const int Max = 100; int t; int Board[Max][Max]; void Cover(int x,int y,int spx,int spy,int size){ if(size==1)return; int s= size / 2; int m = ++t; if(spx<s+x&&spy<s+y){ //特殊格在左上角 Cover(x,y,spx,spy,s); } else{ Board[s+y-1][s+x-1]=m; Cover(x,y,s+x-1,s+y-1,s); } if(spx>=s+x&&spy<s+y){ //右上角 Cover(x+s,y,spx,spy,s); } else{ Board[s+y-1][s+x]=m; Cover(x+s,y,s+x,s+y-1,s); } if(spx<s+x&&spy>=s+y){ //左下角 Cover(x,s+y,spx,spy,s); } else{ Board[s+y][s+x-1]=m; Cover(x,y+s,s+x-1,s+y,s); } if(spx>=s+x&&spy>=s+y){ //右下角 Cover(s+x,s+y,spx,spy,s); } else{ Board[s+y][s+x]=m; Cover(s+x,s+y,s+x,s+y,s); } } int main(void){ int s,r,c; cout << "请输入棋盘大小:"; cin >> s; cout << "请输入特殊方块的行号(从0开始):"; cin >> r; cout << "请输入特殊方块的列号(从0开始):"; cin >> c; Cover(0,0,c,r,s); for(int i=0;i<s;i++){ for(int j=0;j<s;j++){ printf("%d ",Board[i][j]); } putchar('\n'); } return 0; }