C语言问题

求魔方阵代码:#include<stdio.h>#defineN16//这里可以修改N的值intmain(){inta[N][N],i,j,k,p,m,n;p=1;whi... 求魔方阵代码:#include <stdio.h>
#define N 16 //这里可以修改N的值
int main()
{
int a[N][N],i,j,k,p,m,n;
p=1;

while(p==1) /*要求阶数为1~15的商数*/
{ printf("Enter n(n=1~15):"); //可以输入小于等于N-1的整数
scanf("%d",&n);
if((n!=0)&&(n<=N-1)&&(n%2!=0)) p=0;
}

for(i=1;i<=n;i++) /*初始化*/
for(j=1;j<=n;j++) a[i][j]=0;

j=n/2+1; /*建立魔方阵*/
a[1][j]=1;

for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{ if(i<1) i=n;
if(j>n) j=1;
}

if(a[i][j]==0) a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
}

for(i=1;i<=n;i++) /*输出魔方阵*/
{ for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
其中
else
{
i=i+2; //否则K在当前位置的下面
j=j-1;
a[i][j]=k;
}
这段代码有疑问i=i+2;两句话是什么意思,在当前位置的下面?为什么不这样写else
{
i = i + 1;//j不变在当前位置的下面
}
展开
 我来答
萢萢i3
2015-04-10 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.7万
采纳率:71%
帮助的人:4506万
展开全部

给个全一点的给你看:

/**********
 * 魔方阵 *
 **********/

#include <stdio.h>
#include <windows.h>

#define N 500


//建立奇阶魔方阵
void oddCubetastic(int n)
{
/********************************************************************************
 * 创建方法: *
 * a、把1放在N*N方阵中的第一行中间一列,即放在位置为(1,(N+1)/2) *
 * b、后一个数存放的行数比前一个数存放的行数减1,若这个行数为0,则取行数为N *
 * c、后一个数存放的列数比前一个数存放的列数加1,若这个列数为N+1,则取列数为1 *
 * d、如果前一个数是N的倍数,则后一个数存放的列数不变,而行数加1。 *
 ********************************************************************************/

int a[N][N]={0}; //方阵初始化
int i, j, k, num=0;

//方正排列的起始位置
j=(n-1)/2;
i=0;

//创建魔方阵
a[i][j]=1; //把1放在第一行的中间位置

for (k=2; k<=n*n; k++)
{
//规律1:上一个数在第1行最后一列时,则把这个数放在上一个数的正下方
if (i==0&&j==n-1)
{
i=i+1;
a[i][j]=k; //填入数据
continue;
}

//规律2:每一个数存放的行比前一个数的行减1,列数加1
i=i-1;
j=j+1;

//规律3:如果一个数的上一个数的行数为第1行,则这个数放在最后一行
if (i<0)
{
i=n-1;
}

//规律4:如果一个数的上一个数在最后一列,则这个数放在第1列
if (j>=n)
{
j=0;
}

//规律5:如果根据前面位置确定的位置已有数据,则把这个数放在上一个数的正下方
if (a[i][j]!=0)
{
i=i+2;
j=j-1;
}
a[i][j]=k; //填入数据
}

//输出魔方阵
printf("%d阶魔方阵:\n", n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%5d", a[i][j]);
}
num+=a[i][j-1];
printf("\n");
}
printf("判断值为:%d\n", num);
printf("\n\n");
}


//创建4*N式偶阶魔方阵
void evenCubetastic_1(int n)
{



/*****************************************************************************
 *                               创建方法:  *
 * a. 先将1至N*N由小到大的顺序,从第一行开是依序填入N*N的方阵中  *
 * b. 然后将N*N的方阵以4行4列划分为若干个4*4的小方阵  *
 * c. 再将所有4*4小方阵的两个对角线上的数字划掉  *
 * d. 之后将所有被划掉的数字重新由大到小的进行排列  *
 * e. 然后再将这些数字按排列顺序由N*N方阵的第一行开始,放入被划掉的格子中去 *
   * 则此时的偶幻方也就布好阵。  *
 *****************************************************************************/

int a[N][N]={0}; //方阵初始化
int i, j, k=1, num=0;

//先顺序填入所有数据
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
a[i][j]=k++;
}
}


for (i=0; i<=n; )
{
for (j=0; j<n; j++)
{
if ( a[i][j]%4==0|| a[i][j]%4==1)
{
a[i][j]=k-a[i][j];
}
}

if (0==i%4)
{
i=i+3;
continue;
}
if (3==i%4)
{
i++;
continue;
}
}


//输出魔方阵
printf("%d阶魔方阵:\n", n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%5d", a[i][j]);
}
num+=a[i][j-1];
printf("\n");
}
printf("判断值为:%d\n", num);
printf("\n\n");
}


//创建4*N+2式偶阶魔方阵
void evenCubetastic_2(int n)
{


/****************************************************************************
 *                               创建方法: *
 *  将n=4*N+2的方阵划分为田字,分为四个小奇阶方阵,阶数为2*N+1,做以下标记:*
 * a. 左半两个小方阵中正中间的标记上 *
 * b. 左半两个小方阵中除(N+1, 1)的格外,小于N+1的列标记上 *
 * c. 右半两个小方阵中大于N+2的列标记上 *
   * d. 用奇阶魔方阵的创建方式连续创建左上、右下、右上、左下四个小方阵 *
 * e. 将标记的数据对调,即可得4*N+2的魔方阵 *
 ****************************************************************************/

int a[N][N]={0}; //方阵初始化
int i, j, k, num=0;

//方正排列的起始位置
j=(n/2-1)/2;
i=0;

//创建左上角的魔方阵
a[i][j]=1; //把1放在第一行的中间位置

for (k=2; k<=(n/2)*(n/2); k++)
{
if (i==0&&j==n/2-1)
{
i=i+1;
a[i][j]=k;
continue;
}

i=i-1;
j=j+1;

if (i<0)
{
i=n/2-1;
}

if (j>=n/2)
{
j=0;
}

if (a[i][j]!=0)
{
i=i+2;
j=j-1;
}
a[i][j]=k;
}


//方正排列的起始位置
j=(n+(n/2-1))/2;
i=n/2;

//创建右下角的魔方阵
a[i][j]=k;

for (k=k+1; k<=2*(n/2*n/2); k++)
{
if (i==n/2&&j==n-1)
{
i=i+1;
a[i][j]=k;
continue;
}

i=i-1;
j=j+1;

if (i<n/2)
{
i=n-1;
}

if (j>=n)
{
j=n/2;
}

if (a[i][j]!=0)
{
i=i+2;
j=j-1;
}
a[i][j]=k;

}

//方正排列的起始位置
j=(n+(n/2-1))/2;
i=0;

//创建右上角的魔方阵
a[i][j]=k;

for (k=k+1; k<=(n+n/2)*n/2; k++)
{
if (i==0&&j==n-1)
{
i=i+1;
a[i][j]=k;
continue;
}

i=i-1;
j=j+1;

if (i<0)
{
i=n/2-1;
}

if (j>=n)
{
j=n/2;
}

if (a[i][j]!=0)
{
i=i+2;
j=j-1;
}
a[i][j]=k;
}



//方正排列的起始位置
j=(n/2-1)/2;
i=n/2;

//创建左下角的魔方阵
a[i][j]=k;

for (k=k+1; k<=n*n; k++)
{
if (i==n/2&&j==n/2-1)
{
i=i+1;
a[i][j]=k;
continue;
}

i=i-1;
j=j+1;

if (i<n/2)
{
i=n-1;
}

if (j>=n/2)
{
j=0;
}

if (a[i][j]!=0)
{
i=i+2;
j=j-1;
}
a[i][j]=k;
}

//调整方阵使其成为魔方阵
int tmp;
for (i=0; i<n/2; i++)
{
for (j=0; j<(n-2)/4; j++)
{
if ((i==(n-2)/4)&&(j==0))
continue;
else
{
tmp=a[i+n/2][j];
a[i+n/2][j]=a[i][j];
a[i][j]=tmp;
}
}
if (i==(n-2)/4&&j==(n-2)/4)
{
tmp=a[i+n/2][j];
a[i+n/2][j]=a[i][j];
a[i][j]=tmp;
}
}

for (i=0; i<n/2; i++)
{
for (j=n/2-1; j<n; j++)
{
if (j>n/2-1+(n-2)/4+2)
{
tmp=a[i+n/2][j];
a[i+n/2][j]=a[i][j];
a[i][j]=tmp;
}
}
}


//输出魔方阵
printf("%d阶魔方阵:\n", n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%5d", a[i][j]);
}
num+=a[i][j-1];
printf("\n");
}
printf("判断值为:%d\n", num);
printf("\n\n");
}


//主函数
int main()
{
int n;
int i=0;

printf("求 3—N 之间的魔方阵,输入 N 的值:");
scanf("%d", &n);
printf("\n");

for (i=3; i<=n; i++)
{
if (i%2==1)
{
oddCubetastic(i); //求奇阶魔方阵
}
else
{
if (i%4==0)
{
evenCubetastic_1(i); //求4*N式偶阶魔方阵
}

if (i%4==2)
{
evenCubetastic_2(i); //求4*N+2式偶阶魔方阵
}
}
}

system("pause"); //暂停程序便于查看
return 0;
}
更多追问追答
追问
请正面回答我的问题好吗我的意思是那段代码不像能实现使下一个数字出现在上一个数字下面的功能
追答
正面回答如下:
因为在循环的开始执行了如下语句:
i=i-1;
j=j+1;
即已经进行了移位,然后判断出移位后的位置是否有数,当发现变化后的位置已经存在有数的时候,需要退回到原来的数的位置,即 i 要加1,然后再移动到原来位置下一行,即 i 再加 1,所以这里使用的是 i=I+2,列也是一样,因为已经是变化了的位置,但是因为要保持跟原来的数的位置在同一列,所以这里 j 需要减 1,这就是结果。我发的代码中的“建立奇阶魔方阵”的代码部分也有说明。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式