#include <stdio.h>
#include <stdlib.h>
#define N 9
int normal(int i,int j,int mySize);
int isLine1Only(int i,int j,int mySize);
int isColNOnly(int i,int j,int mySize);
int isLine1ColN(int i,int j,int mySize);
int hasNumbers(int i,int j,int mySize);
void makeCube(int n);
void printCube(int mySize);
void initMatrix();
int matrix[N][N];
int main(){
//matrix初始化
int i=0;
int j=0;
//注意 这里mySize应该是奇数
for(i=3;i<=N;i+=2){
initMatrix();
printf("----%d--\n",i);
makeCube(i);
printCube(i);
printf("--------------\n");
}
return 1;
}
void makeCube(int mySize){
//数字1应该放在中间一列
int i=0;
int j=(mySize-1)/2;
int k=0;
for(k=1;k<=mySize*mySize;k++){
matrix[i][j]=k;
if(k==mySize*mySize)break;
//正常情况
if(normal(i,j,mySize)){
//准备好下一次的坐标
i=i-1;
j=j+1;
}else if(isLine1Only(i,j,mySize)){//在第一行 但不是最后一列//那么接下来是最后一行
i=mySize-1;
j=j+1;
}else if(isColNOnly(i,j,mySize)){//在最后一列 但不是第一行//接下来列数为第一列
j=0;
i=i-1;
}else if(hasNumbers(i,j,mySize)){//右上角已经有数字//就放在现在的数字下方
i=i+1;
}else if(isLine1ColN(i,j,mySize)){//第一行最后一列
i=i+1;
}
//matrix[i][j]=k;
}
}
//正常情况 指的是右上角仍然在矩阵内//且右上角没有数字
int normal(int i,int j,int mySize){
//printf("-%d-",1);
if((i>0)&&(j<mySize-1)&&matrix[i-1][j+1]==0){
return 1;
}else{
return 0;
}
}
//在第一行 但不是最后一列
int isLine1Only(int i,int j,int mySize){
//printf("-%d-",2);
if(i==0 &&j!=mySize-1){
return 1;
}else{
return 0;
}
}
//在最后一列 但不是第一行
int isColNOnly(int i,int j,int mySize){
//printf("-%d-",3);
if(i!=0 && j==(mySize-1)){
return 1;
}else{
return 0;
}
}
//在第一行最后一列
int isLine1ColN(int i,int j,int mySize){
//printf("-%d-",5);
if(i==0 &&j==mySize-1){
return 1;
}else{
return 0;
}
}
//右上角有数字//前提是右上角仍在矩阵内
int hasNumbers(int i,int j,int mySize){
//printf("-%d-",4);
int flag=0;
if((i>0)&&(j<mySize-1)&&matrix[i-1][j+1]!=0){
flag=1;
}else{
flag=0;
}
return flag;
}
void printCube(int mySize){
int i=0;
int j=0;
for(i=0;i<mySize;i++){
for(j=0;j<mySize;j++){
if(matrix[i][j]!=0){
printf("%2d ",matrix[i][j]);
}
}
printf("\n");
}
}
void initMatrix(){
int i=0;
int j=0;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
matrix[i][j]=0;
}
}
}
结果是
----3--
8 1 6
3 5 7
4 9 2
--------------
----5--
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
--------------
----7--
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
--------------
----9--
47 58 69 80 1 12 23 34 45
57 68 79 9 11 22 33 44 46
67 78 8 10 21 32 43 54 56
77 7 18 20 31 42 53 55 66
6 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 5
26 28 39 50 61 72 74 4 15
36 38 49 60 71 73 3 14 25
37 48 59 70 81 2 13 24 35
--------------