魔方阵(奇)

//思想:将1存入第一行中间,以后的元素初始化,是讲上一个元素的横坐标+1,纵坐标-1。如果超出数组的方位,则分别放到第一列和第一行。

#include<stdio.h>


int main(int argc, const char * argv[]) {

    int n;

printf("请输入魔方阵的大小:\n");

    scanf("%d",&n);                 //输入奇数,

    while (n%2==0) {                //判断输入是否正确

        printf("输入有误,请重新输入奇数:\n");

        scanf("%d",&n);

    }

    int a[n][n];                    //初始化数组

    int num,i,j;                    //num:用于计数;i:用于存储行;j:用于存储列

    for (i=0; i<n; i++) {           //初始化数组元素都为0

        for (j=0; j<n; j++) {

            a[i][j]=0;

        }

    }

    num=0;

    j=n/2;

    i=0;

    a[i][j]=1;                      //首先设置1的位置。

    for (int t=2; num!=n*n-1;t++ ) {//利用for循环对数组元素依次赋值

        int i1=i,j1=j;              //保存上次初始化的元素的坐标

        

        if (j+1<n) {

            j+=1;

        }else{

            j-=(n-1);               //当列加1向右超出数组,则使它转到第一列

        }

        

        if (i-1>=0) {

            i-=1;

        }else{

            i+=(n-1);               //当行减1向上超出数组,则使它转到第一行

        }

        

        if (a[i][j]==0) {           //判断将要初始化的元素是否为0.

            a[i][j]=t;              //如果为0,则对其初始化;

        }else{                      //如果不为0,则不需要初始化;对上一个元素的下方的元素初始化。

            i=i1+1;

            j=j1;

            a[i][j]=t;

        }

        

        num++;                      //计数

    }

    

    for (i=0; i<n; i++) {           //输出数组

        for (j=0; j<n; j++) {

            printf("%4d\t",a[i][j]);

        }

        printf("\n");

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值