#include<stdio.h>
//奇数魔方阵
void MagicSquare()
{
#define ROW 3
int arr[ROW][ROW] = {0};
int currow = 0;
int curcol = ROW/2;
arr[currow][curcol] = 1;
for(int i = 2; i <= ROW*ROW; i++)
{
currow = (currow - 1 + ROW) % ROW;
curcol = (curcol + 1) % ROW;
if(arr[currow][curcol] != 0)
{
currow = (currow + 1 + 1) % ROW;
curcol = (curcol - 1 + ROW) % ROW;
}
arr[currow][curcol] = i;
}
for(int i = 0; i < ROW; i++)
{
for(int j = 0; j < ROW; j++)
{
printf("%-3d", arr[i][j]);
}
printf("\n");
}
}
//偶数魔方阵(能被4和2整除的)
// 方法一
void MagicSquare1()
{
#define ROW1 4
int arr[ROW1][ROW1];
int tmp1 = 1;
int tmp2 = ROW1*ROW1;
for(int i = 0; i < ROW1; i++)
{
for(int j = 0; j < ROW1; j++)
{
if(( i%4 == j%4) || (i+j)%4 == 3)
{
arr[i][j] = tmp2;
}
else
{
arr[i][j] = tmp1;
}
tmp1++;
tmp2--;
}
}
for(int i = 0; i < ROW1; i++)
{
for(int j = 0; j<ROW1; j++)
{
printf("%-3d", arr[i][j]);
}
printf("\n");
}
}
//偶数魔方阵(能被4和2整除的)
//非对角线,从左到右,从上而下,按数字从小到大,填入该魔方阵
//将魔方阵对角线元素取出来
//取出的元素按从大到小的顺序依次填充到方阵的空缺处。
//法二
void MagicSquare2()
{
#define ROW2 4
int arr[ROW2][ROW2] = {0};
int tmp[ROW2*ROW2/2];
int num;
num = 1;//非对角线填从2开始
for(int i = 0; i < ROW2; i++)
{
for(int j = 0; j < ROW2; j ++)
{
arr[i][j] = num;
num++;
}
}
//取出来元素
num = 0;
for(int i = 0; i < ROW2; i++)
{
for(int j = 0; j < ROW2; j ++)
{
if((i % 4 == j % 4) || ( ( i % 4 + j % 4) == 3))
{
tmp[num] = arr[i][j];
num++;
}
}
}
//将取出的元素按照从大到小的顺序填进去
num = ROW2*ROW2/2 -1;
for(int i = 0; i < ROW2; i++)
{
for(int j = 0; j < ROW2; j ++)
{
if((i % 4 == j % 4) || ( ( i % 4 + j % 4) == 3))
{
arr[i][j] = tmp[num];
num--;
}
}
}
//输出魔方阵
for(int i = 0; i < ROW2; i++)
{
for(int j = 0; j < ROW2; j ++)
{
printf("%-3d",arr[i][j]);
}
printf("\n");
}
}
//偶数魔方阵(不能被4整除但能被2整除)
//**********标记:不是很理解(着重记忆)
void MagicSquare3()
{
#define N 6
int a[N][N] = { {0} };//存储魔方
int i,k,temp;
int col,row;// col 列,row 行
k = N / 2;
col = (k-1)/2;
row = 0;
a[row][col] = 1;
//生成奇魔方A
for(i = 2; i <= k*k; i++)
{
if((i-1)%k == 0 )//前一个数是3的倍数
{
row++;
}
else
{ // if row = 0, then row = N-1, or row = row - 1
row--;
row = (row+k)%k;
// if col = N, then col = 0, or col = col + 1
col ++;
col %= k;
}
a[row][col] = i;
}
//根据A生成B、C、D魔方
for(row = 0;row < k; row++)
{
for(col = 0;col < k; col ++)
{
a[row+k][col+k] = a[row][col] + k*k;
a[row][col+k] = a[row][col] + 2*k*k;
a[row+k][col] = a[row][col] + 3*k*k;
}
}
// Swap A and C
for(row = 0;row < k;row++)
{
if(row == k / 2)//中间行,交换从中间列向右的m列,N = 2*(2m+1)
{
for(col = k / 2; col < k - 1; col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
else//其他行,交换从左向右m列,N = 2*(2m+1)
{
for(col = 0;col < k / 2;col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
}
// Swap B and D
for(row = 0; row < k;row++)//交换中间列向左m-1列,N = 2*(2m+1)
{
for(i = 0;i < (k - 1)/2 - 1;i++)
{
temp = a[row][k+ k/2 - i];
a[row][k+ k /2 -i] = a[row + k][k+k/2 -i];
a[row + k][k+k/2 -i] = temp;
}
}
//输出魔方阵
for(row = 0;row < N; row++)
{
for(col = 0;col < N; col ++)
{
printf("%-3d",a[row][col]);
}
printf("\n");
}
}
int main()
{
//奇数魔方阵
MagicSquare();
printf("\n");
//偶数魔方阵(能被4整除的)
MagicSquare1();
printf("\n");
//正确的偶数魔方阵(能被4整除的)
MagicSquare2();
printf("\n");
偶数魔方阵(不能被4整除但能被2整除)
MagicSquare3();
return 0;
}