参考代码:
/******************
* 魔方阵 *
* 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;
}
# 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;
}
魔方好难啊