该代码仅实现了任意奇数n阶矩阵的魔方阵。
每一行、每一列、对角线之和都相等。
例如3阶魔方阵如下:
8 1 6
3 5 7
4 9 2
算法:1,先给备用数组内所有数赋初值0;(下面的i代表行号,j代表列号)(第1步是为第7步做铺垫)
2,第0行的中间那个数a[i][j]=0,此时i = 0,j = n/2;
3,当前的数在首行(i=0)时,下一个数放在最后一行(i=n-1),j++;
4,当前的数在最后一列(j=n-1)时,下一个数放在第一列(j=0),i--;
5,如果同时满足了(i=0和j=n-1),那么进行i=n-1,j=0;
6,如果3.4.5都不满足,就进行i--,j++;
7,经过上面3步的判断,找到了新的i和j的值,如果此时a[i][j]放的值是0,代表这地方未被用过,可放下一个数;
如果此时这里放的不是0,代表已经被用过了,那么下一个数就直接放到这个数的前面那个数的的下面
2,本例中因为把备用数组弄的10*10的,所以只能输入10内的奇数,大家可以把数组设成100*100甚至更大,从而可以输入100内甚至更大的奇数了。
3,偶数阶魔方存在,大家可以百度搜别人的博客看哈。
每一行、每一列、对角线之和都相等。
例如3阶魔方阵如下:
8 1 6
3 5 7
4 9 2
算法:1,先给备用数组内所有数赋初值0;(下面的i代表行号,j代表列号)(第1步是为第7步做铺垫)
2,第0行的中间那个数a[i][j]=0,此时i = 0,j = n/2;
3,当前的数在首行(i=0)时,下一个数放在最后一行(i=n-1),j++;
4,当前的数在最后一列(j=n-1)时,下一个数放在第一列(j=0),i--;
5,如果同时满足了(i=0和j=n-1),那么进行i=n-1,j=0;
6,如果3.4.5都不满足,就进行i--,j++;
7,经过上面3步的判断,找到了新的i和j的值,如果此时a[i][j]放的值是0,代表这地方未被用过,可放下一个数;
如果此时这里放的不是0,代表已经被用过了,那么下一个数就直接放到这个数的前面那个数的的下面
(比如本例n=3时:4本该放到a[0][1]的,但a[0][1]被1占了,所以,就直接把4放到4的前面那个数3的下面咯。)
备注:1,代码可以说很通俗易懂了,但也很长很多,所以大家可以自由简化;2,本例中因为把备用数组弄的10*10的,所以只能输入10内的奇数,大家可以把数组设成100*100甚至更大,从而可以输入100内甚至更大的奇数了。
3,偶数阶魔方存在,大家可以百度搜别人的博客看哈。
#include<stdio.h>
void main()
{
int a[10][10];
int i,j,ok,n,m;
for(i = 0;i < 10;i++) /*给备用的数组做初始化*/
{
for(j = 0;j < 10;j++)
a[i][j] = 0;
}
ok = 0; /*限定输入的数必须满足要求*/
while(ok == 0)
{
printf("Please input a number as the value of n:(必须是10以内的奇数)\n");
scanf("%d",&n);
if(n % 2 != 0 && n > 0 && n < 10 )
ok = 1;
else
ok = 0;
}
i = 0;
j = n/2;
a[i][j] = 1;
for(m = 2;m <= n*n;m++) /*因为1已经放好了,所以我们从2开始放*/
{
if((i == 0) && (j != n-1)) /*算法中的第3步*/
{
i = n-1;
j = j+1;
if(a[i][j] == 0) /*算法中的第7步*/
a[i][j] = m;
else
{
i = 1;
j = j - 1;
a[i][j] = m;
}
}
else if((i != 0) && (j == n-1)) /*算法中的第4步*/
{
i = i-1;
j = 0;
if(a[i][j] == 0) /*算法中的第7步*/
a[i][j] = m;
else
{
i = i + 1;
j = n - 1;
a[i][j] = m;
}
}
else if((i == 0) && (j == n-1)) /*算法中的第5步*/
{
i = n-1;
j = 0;
if(a[i][j] == 0) /*算法中的第7步*/
a[i][j] = m;
else
{
i = 1;
j = n - 1;
a[i][j] = m;
}
}
else /*算法中的第6步*/
{
i = i-1;
j = j+1;
if(a[i][j] == 0) /*算法中的第7步*/
a[i][j] = m;
else
{
i = i + 2;
j = j - 1;
a[i][j] = m;
}
}
}
printf("%d阶魔方阵:\n",n);
for(i = 0;i < n;i++) /*输出数组*/
{
for(j = 0;j < n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
}