#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a[15][15], i, j, k, p, n;
p = 1;
while (p == 1)
{
printf("enter n(1--15):\n"); //要求阶数为1~15之间的奇数
scanf("%d", &n); //答案输入的是5
if ((n != 0) && (n <= 15) && (n % 2 != 0))
p = 0;
} //这个如果不是输入为奇数,会一直让你输入下去,直到出现奇数
//初始化
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{ //这里把矩阵i,j初始值全换成1,然后初始化全部清零
a[i][j] = 0;
}
}
//建立魔方阵
j = n / 2 + 1;
a[1][j] = 1;
for (k = 2; k <= n*n; k++)
{ //这里i的值是6,因为上面已经运行了一圈j是3因为上面的赋值(输入为5)
i = i - 1; //这里i,j会自减自加,因为k循环,按要求列式,不多讲k=2时i=5,j=4这时
j = j + 1; //a[5][4]==0执行下面if(a[i][j]==0)条件
if ((i<1) && (j>n))
{
i = i + 2; //比如i=1,做了上面的减法i=0,这时i=2等于是上面一个数空了一行,列向
j = j - 1; //前跑了一列
}
else //i>1||j>n;i>1&&j>n;i>1||j<n;i>1&&j<n;i<1||j<n;i<1&&j<n
{ //i<1||j>n;这是一个完整的if else
if (i<1)i = n;
if (j>n)j = 1;
}
if (a[i][j] == 0) //第一个循环因为上面清空了,所以第一次和后面几次给值在这里
a[i][j] = k;
else //a[i][j]!=0,这下面是一个完整的if else
{
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
//输出魔方阵
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
printf("%5d", a[i][j]);
printf("\n");
}
return 0;
}
谭浩强魔方阵看不明白的同学看这里
最新推荐文章于 2022-10-05 18:26:26 发布