求输出下面魔方阵结果的代码,该如何处理

求输出下面魔方阵结果的代码
求输出下面结果的代码

17 16 15 14 13 
18 5 4 3 12
19 6 1 2 11
20 7 8 9 10 
21 22 23 24 25


不知道看明白没有?

------解决方案--------------------
抛砖引玉:

C/C++ code

#include <stdio.h>

#define N 6
#define IFNZERO(xx) if((xx)==0) (xx)

int main()
{
    int i,j,m;
    int a[N][N];
    for(j = 0; j < N; j++)
        for(i = 0; i < N; i++)
            a[i][j] = 0;
    for(i = 0; i <= N/2; i++){
        m = N-i*2-1;
        IFNZERO(a[i][i]) = m*m+1;
        IFNZERO(a[N-i-1][N-i-1]) = (N-i*2)*(N-i*2);
        for(j = i+1; j < N-i; j++) {
            IFNZERO(a[j][i]) = a[j-1][i]-1;
            IFNZERO(a[N-j-1][N-i-1]) = a[N-j][N-i-1]-1;
            IFNZERO(a[i][j]) = a[i][j-1]+1;
        }
        for(j = i+1; j < N-i; j++)
             IFNZERO(a[N-i-1][j]) = a[N-i-1][j-1]-1;
    }

    if(!(N&1)) {             /* 若N为偶数 */
        for(i = 0; i < N/2; i++)
            for(j = 0; j < N; j++){
                m = a[i][j];
                a[i][j] = a[N-1-i][N-1-j];
                a[N-1-i][N-1-j] = m;
            }
    }

    for(j = 0; j < N; j++){
        for(i = 0; i < N; i++)
            printf("%-4d", a[i][j]);
        printf("\n");
    }
    return 0;
}

------解决方案--------------------
这个是我的,代码行比较多,不过逻辑很简单
C/C++ code

#include <stdio.h>

void main(void){
    int direct = 0; // 移动方向:0 右 1 上 2 左 3 下
    int count = 5;  // 要打印数的行数和列数
    int x=0,y=0;    
    int mofang[5][5] = {0};
    x = y = count/2; // 中心坐标
    mofang[x][y] = 1;

    for(int i=2; i<count*count+1; i++){
        if(direct == 0){
            int tx = x + 1;
            int ty = y;
            if(mofang[tx][ty] == 0){
                mofang[tx][ty] = i;
            }else{
                direct = 3;
                i--;
                continue;
            }
            x ++;
            direct = 1;
        }
        else if(direct == 1){
            int tx = x;
            int ty = y - 1;
            if(mofang[tx][ty] == 0){
                mofang[tx][ty] = i;
            }else{
                direct = 0;
                i--;
                continue;
            }
            y --;
            direct = 2;
        }
        else if(direct == 2){
            int tx = x - 1;
            int ty = y;
            if(mofang[tx][ty] == 0){
                mofang[tx][ty] = i;
            }else{
                direct = 1;
                i--;
                continue;
            }
            x --;
            direct = 3;
        }
        else if(direct == 3){
            int tx = x;
            int ty = y + 1;
            if(mofang[tx][ty] == 0){
                mofang[tx][ty] = i;
            }else{
                direct = 2;
                i--;
                continue;
            }
            y ++;
            direct = 0;
        }
    }
    
    for(int n=0; n<count; n++){
        for(int m = 0; m<count; m++){
            printf("%d ",mofang[m][n]);
        }
        printf("\n");
    }
}

------解决方案--------------------
我用循环没整出来,想了想用回朔做的,就一个while循环:
C/C++ code

/*
  magic square V2.0
  ZhongWeilin, Oct 17th, 08 
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#define LEN 5

void print(int a[LEN][LEN]);

void main()
{
    int a[LEN][LEN];
    memset(a, 0, LEN*LEN*sizeof(int));

    print(a);

    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            printf("%3d", a[i][j]);
        }
        printf("\n");
    }
    system("pause");
}

void print(int a[LEN][LEN])
{
    //int init_pos1, initpos2;     //记录初始位置
    int flag;                    //作为判断是否回退的标志
    int i, j;                    //循环变量
    int data = 1;                //数据值
    int flag_add;                //增长方向(增加或减少)
    int flag_row;                //生长方向(行或列)
    //int flag_offset;
 
    /*初始化*/
    a[2][2] = data;
    a[2][3] = ++data;
    i = 2;
    j = 3;
    flag = 1;
    flag_add = 0;
    flag_row = 1;
    //flag_offset = 1;
    

    while(i<5 && j<5)
    {
        if(i==j && i<LEN/2)     //增长方向判断
        {
            flag_add = 1;
            flag_row = 1;
        }
        
        if(i==j && i>LEN/2)     //往外一圈
        {
            ++flag;
            a[i][++j] = ++data;
            flag_add = 0;      //重置
            flag_row = 1;
        }

        if(i!=j && abs(i-2)==abs(j-2))
            flag_row = (flag_row ==1)?0:1;

        /*列的赋值*/
        if(!flag_row)
        {
            if(abs(i-2) != flag)    //控制在邻圈内
            {
                if(flag_add)            
                    --j;            
                else
                    ++j;    
            
                --data;            
            }
            else
            {
                if(flag_add)
                    a[i][++j] = ++data;
                else
                    a[i][--j] = ++data;
            }
        }
        else
        {
            /*行的赋值*/
            if(abs(j-2) != flag)     //控制在邻圈内
            {
                if(flag_add)
                    --i;
                else
                    ++i;

                --data;
            }
            else
            {
                if(flag_add)
                    a[++i][j] = ++data;
                else
                    a[--i][j] = ++data;
            }
        }
    }
    //////////////////////////////////////////////////////////////////
}