#include<stdio.h>
//奇数魔方方阵
//1位于N阶行的中间
//下一个数位于上一行下一列
// 当出现溢出时,注意回逆即可
//当所求位置已经有数字时,下一个数位于下一行
int main()
{
int N;
printf("请输入N阶魔方,0-100之间的奇数:");
scanf("%d",&N);
int i=0,j=0;
int row=0,col=0;
int prerow=0,precol=0;
int arr[100][100]={0};
//找到1的位置
col=N/2;
arr[row][col]=1;
if(N%2!=0&&(N>=3&&N<=100))//对所输入的进行判断
{
for(i=2;i<=N*N;i++)
{
row--;
col++;
//溢出时的判断条件
if(row<0)
row=N-1;
if(col>=N)
col=0;
//当所求位置已经有数字时
if(arr[row][col]!=0)
{
row=prerow+1;
col=precol;
}
arr[row][col]=i;
prerow=row;
precol=col;
}
//打印
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%4d",arr[i][j]);
}
printf("\n");
}
}
return 0;
}
魔方阵的介绍
魔方方阵有,“奇魔方阵”、“偶魔方阵”、“单偶魔方阵”。
魔方阵的规律
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
我们会发现一个本质:其实这就是对依次递增的数字进行找位置,找到它所在的位置并进行输出。然后通过二维数组进行打印出来。
发现的规律:
一.1位于N阶行的中间
二.下一个数位于上一行下一列 如:6就是5的上一行下一列
三.当出现溢出时,注意回逆即可。这里面对这这个回逆的理解,我认为就和一个圈起来的纸卷一 样,我们可以想象一下如果这样类比的话,2不就是在6的同列上一行。
四.当所求位置已经有数字时,下一个数位于下一行 。
代码内容的介绍
//当所求位置已经有数字时
if(arr[row][col]!=0)
{
row=prerow+1;
col=precol;
}
arr[row][col]=i;
prerow=row;
precol=col;
}
当所占位置已经有数字时,要注意一点,它的下一行位置是相对于前一个位置的移动,所以此时一定要对前一个数的位置进行标记。
总结
看已知的图表时不要慌张,找到它们之间的规律并发现之间的规律,如杨辉三角,斐波拉契等问题,要慢慢理清思路。最后欢迎大佬在评论区对其余两种“魔方阵”进行解析。