C/C++魔方阵,通俗易懂的版本。

魔方阵规律介绍一下:

//所谓“n - 魔方阵”,指的是使用1〜n2共n2个自然数排列成一个n×n的方阵,其中n为奇数;该方阵的每行、每列及对角线元素之和都相等,并为一个只与n有关的常数,该常数为n×(n2 + 1) / 2。

//	例如5 - 魔方阵,其第一行、第一列及主对角线上各元素之和如下:
//	第一行元素之和:17 + 24 + 1 + 8 + 15 = 65
//	第一列元素之和:17 + 23 + 4 + 10 + 11 = 65
//	主对角线上元素之和:17 + 5 + 13 + 21 + 9 = 65

//	而 n×(n2 + 1) / 2 = 5×(52 + 1) / 2 = 65 可以验证,5 - 魔方阵中其余各行、各列及副对角线上的元素之和也都为65。

//	假定阵列的行列下标都从0开始,则魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n2 - 1个数依次按下列规则存放:
//	(1) 假定当前数的下标为(i,j),则下一个数的放置位置为当前位置的右上方,即下标为(i - 1,j + 1)的位置。
//	(2) 如果当前数在第0行,即i - 1小于0,则将下一个数放在最后一行的下一列上,即下标为(n - 1,j + 1)的位置。
//	(3) 如果当前数在最后一列上,即j + 1大于n - 1,则将下一个数放在上一行的第一列上,即下标为(i - 1,0)的位置。
//	(4) 如果当前数是n的倍数,则将下一个数直接放在当前位置的正下方,即下标为(i + 1,j)的位置。

下面是代码:

#include <stdlib.h>
#include<stdio.h>
#include<string.h>

#define N 15

int  main(void) 
{







	//定义二维数组
	int a[N][N],i=0,j=0,k,oldj=0,oldi=0;

	//初始化数组
	memset(a,0,sizeof(a));
	找出1的位置  并赋值

	j = (N - 1) / 2;
	a[i][j]=1;

	//遍历2开始的数
	for ( k = 2; k <= N*N; k++)
	{
		//存放当前位子的行号和列号
		oldi = i;
		oldj = j;
		//下一个数的坐标
		i = i - 1;
		j = j + 1;
		//如果小于0表示当前数在第0行
		if (i < 0) 
		{
			//让下一个数在最后一行的下一列
			i = N - 1;
		
			//判断是否是最后一列
			if (j > i) 
			{
			
				j = 0;
			}
			//判断是否是当前数的倍数 如果是就在他下方
		    if((k-1)%N==0)
			{
				i = oldi + 1;
				j = oldj;
				
			}
		
			a[i][j] = k;
		}
		else
		{
			//判断是否是最后一列
			if (j > (N-1))
			{

				j = 0;
			}
			//判断是否是当前数的倍数 如果是就在他下方
		if ((k-1)% N == 0)
			{
			i = oldi + 1;
			j = oldj;


			}

			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]);

		 }
		 printf("\n");
	 }


	system("pause");
	return 0;
}`

结果:
5阶魔方阵:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
请按任意键继续. . .

其实魔方阵就是if else判断

简化版代码:

#include<stdio.h>
#define N 5
int main()
{
    int a[N][N]={0}, i, j, k, t, x, y;
    i=0;  /*自然数1的行标*/
    j=N/2;  /*自然数1的列标*/
    t=N-1;  /*最后一行、最后一列的下标*/
    for(k=1; k<=N*N; k++)
    {
        a[i][j]=k;
        x=i;
        y=j;
        if(i == 0)
            i=t;
        else
            i=i-1;
        if(j != t)
            j=j+1;
        else
            j=0;
        if(a[i][j]!=0)
        {
            i=x+1;
            j=y;
        }
    }
    printf("生成的5-魔方阵为:");
    for(i=0; i<N; i++)
    {
        printf("\n");
        for(j=0; j<N; j++)
        {
            printf("%3d", a[i][j]);
        }
    }
    printf("\n");
    return 0;
}

结果:
5阶魔方阵:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
请按任意键继续. . .

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值