其他分享
首页 > 其他分享> > 神奇的幻方(C语言)

神奇的幻方(C语言)

作者:互联网

神奇的幻方(C语言解法)
幻方是一个很神奇的N×N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入格式
一个数字 N(N≤20)。

输出格式
按上方法构造的(2N−1)×(2N−1) 的幻方。

输出时每行末尾的多余空格,不影响答案正确性

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

这一题,乍一想用两层循环好像没法填充,只能用一层循环。一层循环的话思路还是简单常规,把边界条件限制住了还有操作规律给到就行。代码如下:

#include "stdio.h"
#include "string.h"
int main()
{
    int N;
    scanf("%d",&N);
    int a[100][100];
    memset(a,0,sizeof(a)/sizeof(int));
    int x=0,y=(2*N-1)/2;
    a[x][y]=1;
    for (int i=2;i<=(2*N-1)*(2*N-1);i++)
    {
        if (x==0 && y==2*N-2)
            x++;
        else if (x==0)
        {
            x=2*N-2;
            y++;
        }
        else if (y==2*N-2)
        {
            y=0;
            x--;
        }
        else if(a[x-1][y+1]!=0)
            x++;
        else
        {
            x--;
            y++;
        }
        a[x][y]=i;
    }
    for (int i=0;i<2*N-1;i++)
    {
        for (int j=0;j<2*N-1;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}

程序是通过了,但有一个小小的问题,当该数组a的大小为a[40][40],n>=8的时候,会出现如下报错:
*** stack smashing detected ***: terminated
运行时错误。在你的程序的执行过程中,可能出现了非法的文件访问、堆栈溢出、非法访问了内存单元、数组越界、在计算中把0作为除数等导致程序异常结束的情况。
这是我百思不得其解的地方。因为N<=20,2N-1最大也就39,应该是不存在他所说的问题(n<=7的输出是正确的)。希望懂的大神能够评论一下。
这个方法可能不是最优解,如果有更好的方法,欢迎评论!

标签:数字,int,幻方,C语言,++,一个,else,神奇
来源: https://blog.csdn.net/T579la/article/details/120757837