神奇的幻方(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