c语言中n阶魔方中的问题,详情请进,满足要求再追分

来源:百度知道 编辑:UC知道 时间:2024/06/07 19:25:00
#include<stdio.h>
main()
{
int a[99][99];
int n,i,j,r;
scanf("%d",&n);
for(i=0;i<99;i++)
{
for(j=0;j<99;j++)
{
a[i][j]=0;
}
}
i=0;
j=n/2;
a[i][j]=1;
————————————————————
| for (r=2;r<=n*n;r++) |
| if (a[(i+n-1)%n][(j+1)%n]==0) |
| { |
| i=(i+n-1)%n; |
| j=(j+1)%n; |
| a[i][j]=r; |
| } |
| else |
| { |
| i=(i+1)%n; |
| a[i][j]=r; |
| } |
————————————————————
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
pri

for (r=2;r<=n*n;r++) /*从2开始排到n*n */
if (a[(i+n-1)%n][(j+1)%n]==0)
/*判断下一个位置是否已经排了数,如果为0,则没有排,位置空,这时可以把r的值放上去。*/
{
i=(i+n-1)%n; /*把该位置行数值赋给i*/
j=(j+1)%n; /*把该位置列数值赋给j*/
a[i][j]=r; /*把r值排到该位置上*/
}
else /*如果下一位置不为0,则已安排了其它数,这时只能把r值安排在上一个数的下方的位置*/
{
i=(i+1)%n;/ *行数+1 */
a[i][j]=r; /*把r值放到该位置*/
}
这里要说的是行数上移一层,用(i-1+n)%n,取余,之所以加n是不让行数值为负值,加n不会影响余数。而列数加1不会出现负的情况,所以不用加n。

魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;