C语言程序,求奇阶魔方阵的问题
发布网友
发布时间:2022-05-27 16:43
我来回答
共2个回答
热心网友
时间:2023-11-04 12:45
魔方阵的填写方法是:“1立首列中,右1上1,受阻下1。”注意:受阻下1是在没右1上1时下1。.
#include<stdio.h>
void main()
{
int a[10][10]={0};
int n,i,x,y;
printf("Please Input N=");
do
scanf("%d",&n);
while((n%2==0)||(n>9)||(n<3));
x=1;
y=n/2+1;
a[x][y]=1;
for(i=2;i<=n*n;i++)//for循环作用是将数2到n*n填入矩阵
{
x=x-1;//上移一行
y=y+1;//右移一行
if((x+1==1)&&(y-1==n))
/*如果要填入的位置为[0][n+1],按照下面越界处理,应该
在[n][1]处填数,但是事实证明[n][1]处肯定已经填好数了,
故遇阻,相对于前一个填入的数位置[1][n]下移一行(即在
[2][n]填入),如果按照下面的处理对[0][n+1]下移2位左移
一位(即相对于前一个填入的数位置[1][n]下移一行),由于没
有对下移和左移越界处理,如果不特殊处理,必定出错故对这
一特殊情况直接处理令x=2,y=n。
ps:我认为这么写不好,很难理解且容易出错*/
{
x=2;
y=n;
}
if(x==0)//上移越界处理
x=n;
if(y==n+1)//右移越界处理
y=1;
if(a[x][y]!=0)//如果遇阻,下移一行(即相对于上一右一后再下二左一)
{
y=y-1;//左一
x=x+2;//下二
}
a[x][y]=i;
}
for(x=1;x<=n;x++)
{
for(y=1;y<=n;y++)
printf("%4d",a[x][y]);
printf("\n");
}
}
这个不好理解,下面这样写应该好理解点:
#include<stdio.h>
void main()
{
int a[10][10]={0};
int n,i,x,y;
printf("Please Input N=");
do
scanf("%d",&n);
while((n%2==0)||(n>9)||(n<3));
x=1;
y=n/2+1;
a[x][y]=1;
for(i=2;i<=n*n;i++)//for循环作用是将数2到n*n填入矩阵
{
x=x-1;//上移一行
y=y+1;//右移一行
if(x==0)//上移越界处理
x=n;
if(y==n+1)//右移越界处理
y=1;
if(a[x][y]!=0)//如果遇阻,下移一行(即相对于上一右一后再下二左一)
{
y=y-1;//左一
x=x+2;//下二
}
if(x>n)//下移越界处理,由于可能越2界位,故跟其他处理方法不一样,其他的也可以这么写,但这个不能跟其他的一样写,呵呵
x=x-n;
if(y==0)//左移越界处理
y=n;
a[x][y]=i;
}
for(x=1;x<=n;x++)
{
for(y=1;y<=n;y++)
printf("%4d",a[x][y]);
printf("\n");
}
}
热心网友
时间:2023-11-04 12:45
这个涉及到奇阶魔方阵的特征:第一个位置在第一行正中,后一个的位置在前一个位置的右上方,但如果右上方的位置已经超过了方阵上边界,那么新位置应该在所选列的最下面一个位置;如果右上方的位置超出了方阵的右边界,那么新位置应该在所选列的最左边一个位置;如果最近插入的元素为n的整数倍,那么选下面一行同列上的位置为新位置。