奇数魔方阵、偶数魔方阵(能被4和2整除的 和 不能被4整除但可以被2整除)

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值