#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 --------------