• 魔方阵 奇数偶数都成立(2)


    续(1),现在写一个直接输入任意大于3的整数的程序,直接判断其是否为魔方阵,程序如下:

    #include<stdio.h>
    #include<string.h>
    #define M 100
    int main()
    {
    int n,a[M][M];
    void output(int a[][M],int n);
    void J_MFZ(int a[][M],int n);
    void SO_MFZ(int a[][M],int n);
    void DO_MFZ(int a[][M],int n);
    void check(int a[][M],int n);
    printf("请输入n,n为大于3的整数:\n");
    while(scanf("%d",&n)!=EOF&&n>=3)
    {
    memset(a,0,sizeof(a));
    if(n%2)
    {
    J_MFZ(a,n);
    output(a,n);
    check(a,n);
    }
    else if(n%4==0)
    {
    SO_MFZ(a,n);
    output(a,n);
    check(a,n);
    }
    else
    {
    DO_MFZ(a,n);
    output(a,n);
    check(a,n);
    }
    printf("请输入n,n为大于3的整数:\n");

    }
    return 0;
    }
    void output(int a[][M],int n) //输出魔方阵函数
    {
    int i,j;
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    printf("%4d",a[i][j]);
    putchar('\n');
    }

    }
    void J_MFZ(int a[][M],int n) //奇魔方阵函数
    {
    int x,y,i,j,k;
    a[0][n/2]=1;
    i=0;
    j=n/2;
    for(k=2;k<=n*n;k++)
    {
    x=i;
    y=j;
    i--;
    j++;
    if(i<0)i=n-1;
    if(j>n-1)j=0;
    if(a[i][j]!=0)
    {
    i=x+1;
    j=y;
    }
    a[i][j]=k;
    }
    }

    void SO_MFZ(int a[][M],int n) //双偶魔方阵函数
    {
    int i,j,k;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
    if(i<n/2&&j<n/2||i>=n/2&&j>=n/2)
    {
    if(i%2==0&&j%2==1||i%2==1&&j%2==0)
    a[i][j]=1;
    }
    else
    {
    if(i%2==0&&j%2==0||i%2==1&&j%2==1)
    a[i][j]=1;
    }
    }
    k=n*n;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
    if(a[i][j]==1)
    a[i][j]=k;
    k--;
    }
    k=1;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
    if(a[i][j]==0)
    a[i][j]=k;
    k++;
    }

    }

    void DO_MFZ(int a[][M],int n) //单偶数魔方阵
    {
    int i,j,t,m;
    J_MFZ(a,n/2);
    m=(n-2)/4;
    for(i=n/2;i<n;i++)
    for(j=n/2;j<n;j++)
    a[i][j]=a[i-n/2][j-n/2]+n/2*n/2;
    for(i=0;i<n/2;i++)
    for(j=n/2;j<n;j++)
    a[i][j]=a[i+n/2][j]+n/2*n/2;
    for(i=n/2;i<n;i++)
    for(j=0;j<n/2;j++)
    a[i][j]=a[i-n/2][j+n/2]+n/2*n/2;
    //换数字
    //C与B换
    for(i=0;i<n/2;i++)
    for(j=n/2;j<n;j++)
    if(j>m+1+n/2)
    {
    t=a[i][j];
    a[i][j]=a[i+n/2][j];
    a[i+n/2][j]=t;
    }

    //换(m+1,m+1)
    t=a[m][m];
    a[m][m]=a[m+n/2][m];
    a[m+n/2][m]=t;
    //换A,D数字
    for(i=0;i<n/2;i++)
    for(j=0;j<n/2;j++)
    if(j<m)
    {
    if(i==m&&j==0)continue;
    t=a[i][j];
    a[i][j]=a[i+n/2][j];
    a[i+n/2][j]=t;
    }

    }
    void check(int a[][M],int n)
    {
    int i,j,s,m,p=1;
    m=(1+n*n)*n*n/2/n;
    for(i=0;i<n;i++)//检测行
    {
    s=0;
    for(j=0;j<n;j++)
    s+=a[i][j];
    if(s!=m)
    {
    p=0;
    break;
    }
    }
    for(j=0;j<n;j++) //检测列
    {
    s=0;
    for(i=0;i<n;i++)
    s+=a[i][j];
    if(s!=m)
    {
    p=0;
    break;
    }
    }

    s=0;
    for(i=0;i<n;i++)//检测对角线
    s+=a[i][i];
    if(s!=m)p=0;

    s=0;
    for(i=0;i<n;i++)
    s+=a[i][n-1-i];
    if(s!=m)p=0;


    if(p==0)printf("不是魔方阵\n\n");
    else
    printf("是魔方阵,其相加相等的数为%d.\n\n",m);

    }


    有错误或其它请予以指正!

  • 相关阅读:
    剑指offer(14)链表中倒数第K个节点
    剑指offer(13)调整数组顺序使奇数位于偶数前面
    跨域资源共享CORS
    同源政策
    剑指offer(12)数值的整数次方
    剑指offer(11)二进制中1的个数
    面试金典——交点
    LeetCode——简化路径
    LeetCode——跳跃游戏 I-II
    LeetCode——最大矩形
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2389602.html
Copyright © 2020-2023  润新知