奇数阶幻方问题求解

/*
* 求解数据结构为矩阵。
* 
* 具体操作步骤如下:
* 【1】首先将 1 放在最上边一行正中间,然后将下一个整数放在右上方;
* 【2】如果到达最上一行,下一个整数就放在最后一行,列位置不变;
* 【3】如果到达最右端,则下一个数放在最左端,行位置不变;
* 【4】当到达的方格中已经填上数字时,下一个整数就放在刚填的那个数字方格的正下方。
*/

#include <stdio.h>
#include <stdlib.h>

void magic(int n) {
    // 判断输入参数是否合法
    if(n < 0 || n % 2 == 0){
        return;
    }
    int rowSum = 0;
    int i = 0,j = 0;
    int ni = 0,nj = 0;
    int k = 0;
    // 待填入的整数
    int nn = n * n;
    //动态申请二维数组
    int ** magicVector = (int **)malloc(n * sizeof(int));
    for(i=0;i<n;i++){
        magicVector[i] = (int *)malloc(n * sizeof(int));
    }
    //初始化二维数组
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            magicVector[i][j] = 0;
        }
    }
    //初始话数组索引
    i = 0; j = n / 2;
    for(k=1;k<=nn;k++){
        magicVector[i][j] = k;
        if(i == 0)
            ni = n - 1;
        else
            ni = i - 1;
        if( j == (n-1))
            nj = 0;
        else
            nj = j + 1;
        if(magicVector[ni][nj] == 0){
            i = ni;
            j = nj;
        }else{
            i++;
        }
        //j = nj;
    }
    //打印输入二维数组
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%4d",magicVector[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<n;i++){
        rowSum += magicVector[0][i];
    }
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
    printf("The sum of row or line or cross is %d\n",rowSum);
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}

int main() {
    int row = 0;
    while(1){
        printf("\nPlease input row or col of MagicMatrix(#0 to quit#)\n");
        printf(">>>");
        scanf("%d",&row);
        if(row == 0)
            break;
        magic(row);
    }
    return 0;
}

    



转载于:https://my.oschina.net/cuinp/blog/317140

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值