c语言编辑魔方阵问题,我这个错在哪里

2025-03-29 07:21:47
推荐回答(3个)
回答1:

参考代码:

/******************
 * 魔方阵         *
 * Author:萢萢i3 *
 ******************/

#include 
#include 

#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 {
for (j=0; 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 {
for (j=0; j {
a[i][j]=k++;
}
}


for (i=0; i<=n; )
{
for (j=0; 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 {
for (j=0; 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 {
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 {
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 {
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 {
for (j=n/2-1; 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 {
for (j=0; 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;
}

回答2:

# include 
int main()
{
int i, j, k, n, temp1, temp2,a[15][15];
scanf("%d", &n);
for (i = 0; i <= n; i++)
for (j = 0; j <= n; j++)
a[i][j] = 0;

i = 0;
j = n / 2;
a[i][j] = 1;
for (k = 2; k <= n*n; k++)
{
if (i == 0) { temp1 = n - 1; }
else temp1 = i - 1;
if (j == n - 1) { temp2 = 0; }
else temp2 = j + 1;
if ((a[temp1][temp2] != 0) || (i == 0 && j == n)) { temp1 = i + 1; temp2 = j; }
i = temp1; j = temp2;
a[i][j] = k;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
 return 0;
}

回答3:

魔方好难啊