C 魔方阵

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

 

posted @ 2013-03-20 23:08  cart55free99  阅读(172)  评论(0编辑  收藏  举报