您的位置:首页 > 其它

魔方阵(奇)

2016-07-26 17:10 204 查看
//思想:将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

;                    //初始化数组
    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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: