题目描述
输出魔方阵,所谓魔方阵就是指这样的方阵,它的每一行每一列和对角线之和都相等,例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出由1—n^2之间的自然数构成的魔方阵。
输入要求
输入该方阵的阶数n(n<=15且n为奇数)。
输出要求
输出该n阶魔方阵,两个数字之间用空格间隔
输入样例
3
输出样例
8 1 6 3 5 7 4 9 2
提示
由于魔方阵的填法有很多种,这里给出一种填法:
1.将1放在第一行的最中央。
2.接下来的每个数字都放在前一个数字的右上方。如果右上方被占,则放在前一个数字的下面。
请按照这种方法输出对应的魔方阵!
代码
#include<stdio.h>//
int main(void){
int n,x,y,a[20][20]={0},i,j,k;//先在1个20*20的二维数组里全部存储0
scanf("%d",&n);
x=(n-1)/2;//赋初值,从中间的位置开始
y=0;//从第0行开始
a[y][x]=1;//先令第 0行的中间位置为1
//核心赋值部分,遍历输入部分
//需要循环输入的次数n*n,已经输入1,所以从2开始
for(i=2;i<=n*n;i++)
{//先记录下上次已经遍历点的列和行数分别存储给j和k
j=x;k=y;
x+=1;y-=1;//遍历的规律,列数向右移动,行数向上移动
if(y==-1&&x<=n-1)//y==-1向上越界
{y=n-1;}//y恢复从最下面开始向上走
else if(y>=0&&x==n)//x==n横向越界(向右)
{x=0;}//x恢复从最左边开始向右走
else if(y==-1&&x==n)//x==n横向越界(向右)同时y==-1(向上)越界
{x=0;y=n-1;}//y恢复从最下面开始向上走,x恢复从最左边开始向右走
//如果不等于0,说明已经被遍历过
if(a[y][x]!=0)//就下一次选择移动到 上一次遍历过的 点的正下方
{
x=j;
y=k+1;
if(y==n)//在y=k+1之后,如果向下越界,就恢复为第0行
{
y=0;
}
}
a[y][x]=i;//赋值每一次i递增后都赋值给每一个正在遍历的位置
}
//遍历输出部分和格式要求(按照正方形的格式输出)
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",a[i][j]);//如果当n大一点,可以在把%d改成%5d或者其他,右对齐
if(j==n-1)
{printf("\n");}
else
{printf(" ");}
}
}
}
//本代码借鉴其他同学的,作者在此基础是注释说明,感谢更多朋友分享源代码