C语言做的魔方阵

C语言做的魔方阵,第1张

下面是一个打印奇数阶魔方阵的程序掘氏橡:

#include<stdio.h>

int main()

{int n=0,i,j,k=1,p,q,a[20][20]={0}

while(!(n%2))

{printf("请输入一个小核态于20的奇判旁数:")

scanf("%d",&n)

}

i=0

j=n/2

for(p=0p<np++)

{for(q=0q<nq++)

{if(q>0)

{i=(i+n-1)%n

j=(j+1)%n

}

a[i][j]=k++

}

i=(i+1)%n

}

for(i=0i<ni++)

{for(j=0j<nj++)

printf("%4d",a[i][j])

printf("\n")

}

return 0

}

程序代码:

#include&清耐ltstdio.h&gt

#define N 16

int main()

{

int a[N][N]={0},i,j,k,p,n

p=1

while(p==1)

{

printf("Enter n(1~%d):",N)

scanf("%d",&n)

if((n!=0)&&(n&ltN)&&(n%2!=0))

p=0

}

i=n+1

j=n/2+1

a[1][j]=1

for(k=2k&lt=n*nk++)

{

i=i-1

j=j+1

if((i&lt1)&&(j&gtn))

{

i=i+2

j=j-1

}

else

{

if(i&lt1)i=n

if(j&gtn)j=1

}

if(a&lti&gt[j]==0)a&lti&gt[j]=k

else

{

i=i+2

j=j-1

a&lti&gt[j]=k

}

}

for(i=1i&lt=ni++)

{

for(j=1j&lt=nj++)

printf("%4d",a&lti&gt[j])

printf("\n")

}

return 0

}

扩展资料:

1.第一行中间一列的值为1。

所以用j=n/2+1确定1的列数,得出a[1][j]=1。

2.每一个数存放的行比前一个数的行数减1,列数加1。

行数用i=i-1确定,列数用j=j+1确定。

3.如果一个数行数为第一行,则下一个数行数为最缺键后一行。

4.如果一个列行数为最后一列,则下一个数列数为第一列。

5.如果按上面的规则确定的位置伏正巧上已有数,或上一个数是第一行最后一列,则把下一个数放在上一个数的下面。

魔方阵的填写方法是:“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=2i<=n*ni++)//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=1x<=nx++)

{

for(y=1y<=ny++)

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=2i<=n*ni++)//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=1x<=nx++)

{

for(y=1y<=ny++)

printf("%4d",a[x][y])

printf("\n")

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12519589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存