魔方阵1~n*n(全)--C语言

article/2025/8/29 9:06:36

魔方阵的构造

描述:由n*n个数字所组成的n阶方阵,若具有各对角线、各横列与纵行的数字和都相等的性质,则称为魔方阵。
这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。
如下所示为一个3阶魔方阵和一个四阶魔方阵。在这里插入图片描述
魔方阵的构建方法很多,一般将n分为三类,这三类n构成的魔方阵的算法各不相同。

  1. 当n为奇数,即n=2*k+1时,常采用简捷连续填数法。
  2. 当n为单偶数(n是偶数,但又不能被4整除),即n=4*k+2时,常采用井字调整法。
  3. 当n为双偶数(n能被4整除),即n=4*k时,常采用双向翻转法。

构造奇数阶魔方阵

奇数阶魔方阵的构造方法为:
首先把1放到顶行的正中间,然后把后继数按顺序放置在右上斜的对角线上,并作如下修改:

  1. 当到达顶行时,下一个数放到底行,好像它在顶行的上面;
  2. 当到达最右端列时,下一个数放在最左端列,好像它紧靠在右端列的右方;
  3. 当到达的位置已经填好数时,或到达右上角的位置时,下一个数就放在刚填写数的位置的正下方。

下面以构造一个3阶魔方阵为例,说明这种方法的构造过程,具体如下图所示。
图1  简捷连续填数法构造3阶魔方阵
编题思路

  • 程序中定义一个二维数组a[N][N]来保存方阵,初始时,数组中所有元素均置0。
  • 用变量row和col来存储待填数字num在方阵中的位置,由于第1个数字放在顶行的正中间,因此初始时,行row=0,列col=n/2,待填写数字num=1。
  • 采用简捷连续填数法构造方阵的过程是一个循环程序,描述为:
    While (待填写数字num<=n*n)
    {
    确定待填写数字num应该填写的位置row和col;
    填写num,即a[row][col]=num;
    Num++; // 下一个待填写的数字
    }
  • 程序中,确定待填写位置的方法是:
  1. 后继数按顺序放置在右上斜的对角线上,即row–; col++;
  2. 有三种情形需要调整。
    当到达顶行时(即row<0), row=n-1;
    当到达最右端列时(即col==n), col=0;
    当到达的位置已经填好数时(即(a[row][col]!=0), row+=2; col–;
  3. 有一种情况,当到达右上角的位置时(row=-=0 && col==n-1),直接进行特殊处理,row++ 。

构造双偶数阶魔方阵

当n为双偶数,即n=4*k时,采用双向翻转法。双向翻转法构造魔方阵的步骤如下:

  1. 将数字1到n*n按由左至右、由上到下的顺序填入方阵中。
  2. 将方阵中央部分半数的行中的所有数字左右翻转。
  3. 将方阵中央部分半数的列中的所有数字上下翻转。

由于在构造的过程中需要进行两次翻转,因此称为双向翻转法。下面以构造一个4阶魔方阵为例,说明这种方法的构造过程,具体如下图所示。
图2  双向翻转法构造4阶魔方阵

构造单偶数阶魔方阵

当n为单偶数,即n=4*k+2(6、10、14、18、22、26、30…)时,采用井字调整法。井字调整法构造魔方阵的步骤如下:

  1. 将数字1到n*n按由左至右、由上到下的顺序填入方阵中,然后在第k + 1、3 k + 2 行及列做井字标记。
  2. 将井字两边长方形中的数字和其对称位置的数字交换。注:坐标( x, y) 的对称位置为 ( n + 1 – x,n + 1 - y )。
  3. 将井字分隔线的两横行及第k + 2行两侧的数字左右对调,两横行中央的数字上下对调。左边纵列的数字除交叉点外垂直翻转。
  4. 将井字分隔线的两纵列中央的数字除第 2k+1行外左右对调,两横行左方的第一个数字上下对调,上横行中央的数字水平翻转。

在构造单偶数阶魔方阵的过程中,为了便于识别,构造时在方阵中有井字形的纵横线标记,因此称为井字调整法。
图3所示为一个6(4*1+2,k=1)阶魔方阵的构造过程,具体步骤如下:

  1. 先将数字1~36顺序填入方阵,然后在第 2(1+1)、5(3*1+2)列及第 2、5 行做上井字形标记,如下图(1)所示。
  2. 将井字两边长方形中的数字与其对称位置的数字交换,如下图(2)所示,图中交换的数字用黑框标出
  3. 将第 2、3、5行两侧的数字左右对调,第 2、5行中央的数字上下对调,第 2列的数字除交叉点外进行垂直翻转,如下图(3)所示,图中交换的数字依次用波浪线框、单线框和黑框标出。
  4. (4)第 2、5列中央的数字(第3行中的数字除外)左右对调,第 2行中央的数字水平翻转,第 2、5行左边的第一个数字上下对调,如图下(4)所示,图中交换的数字依次用波浪线框、单线框和黑框标出。
    图3  井字调整法构造6阶魔方阵

代码来源

说明:构造魔方阵方法来源于此链接,下面源代码是我经过研究,整理,接着敲成的
点击此处,产看更详细步骤

源程序代码

#include<stdio.h>void print(int a[][30],int n)                     //打印矩阵函数
{int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++)if(j==n-1)printf("%d",a[i][j]);elseprintf("%-4d",a[i][j]);printf("\n");}
}
void swap(int *x,int *y)                          //x和y交换
{int t;t=*x; *x=*y; *y=t;
}
void one(int n)                                   //n为奇数(简捷连续填数法)
{int num,row,col;                              //row:第一维(行);col:第二维(列)int a[30][30];for(row=0;row<n;row++)    for(col=0;col<n;col++)a[row][col]=0;                        //初始化,数组中所有元素均置0num=1;row=0;col=n/2;a[row][col]=num;while(num<=n*n){num++;if(row==0&&col==n-1)                     //达到右上角位置row++;else{row--; col++;if(row<0) row=n-1;if(col==n) col=0;if(a[row][col]!=0){row+=2;col--;}}a[row][col]=num;}print(a,n);
}
void two(int n)                               //n为双偶数(双向反转方法)
{int row,col,k;int num,a[30][30];num=1; k=n/4;for(row=0;row<n;row++)for(col=0;col<n;col++)a[row][col]=num++;for(row=k;row<=k*3-1;row++)for(col=0;col<n/2;col++)swap(&a[row][col],&a[row][n-1-col]);for(col=k;col<=k*3-1;col++)for(row=0;row<n/2;row++)swap(&a[row][col],&a[n-1-row][col]);print(a,n);
}
void three(int n)                            //n为单偶数(井字调整法)
{int row,col,k;int a[30][30],num=1;for(row=0;row<n;row++)for(col=0;col<n;col++)a[row][col]=num++;k=(n-2)/4;for(row=0;row<=k-1;row++)for(col=k+1;col<=3*k;col++){swap(&a[row][col],&a[n-1-row][n-1-col]);swap(&a[col][row],&a[n-1-col][n-1-row]);}for(col=0;col<=k-1;col++){swap(&a[k][col],&a[k][n-1-col]);                //井字分割线第k+1swap(&a[3*k+1][col],&a[3*k+1][n-1-col]);          //井字分割线3k+2swap(&a[k+1][col],&a[k+1][n-1-col]);                //第k+2行}for(col=k+1;col<=3*k;col++)swap(&a[k][col],&a[3*k+1][col]);for(row=0;row<n/2;row++)if(row!=k)swap(&a[row][k],&a[n-1-row][k]);swap(&a[k][0],&a[3*k+1][0]);for(col=k+1;col<n/2;col++)swap(&a[k][col],&a[k][n-1-col]);        for(col=k+1;row<=3*k;row++)if(row!=2*k)swap(&a[row][k],&a[row][3*k+1]);print(a,n);
}int main()
{int n;printf("Input n:\n");scanf("%d",&n);if(n%2!=0)one(n);else if(n%4==0)two(n);else if((n-2)%4==0)three(n);return 0;
} 

说明:若想打印“更大”的魔方阵,将二维数组的范围更改更大即可
输出示例:
11阶魔方阵


http://chatgpt.dhexx.cn/article/j8oFIb5J.shtml

相关文章

《齿轮制作》

新建一个画板&#xff0c;然后托入俩条补助线&#xff0c;选中矩形工具画矩形再用直接选择工具选择选中矩形得点然后点击鼠标托动变形。 再复制一个图层按shiftt&#xff0c;把中心点托到补助线中心&#xff0c;再用鼠标移动一个角度&#xff0c; 再按住快捷键shiftctrlaltt。…

斜齿轮设计

目录 一、 前 言 二、 工艺规程设计说明 &#xff08;一&#xff09; 工艺规程制定的目的 &#xff08;二&#xff09; 工艺规程制定的原则 &#xff08;三&#xff09; 工艺规程制定的原始资料 &#xff08;四&#xff09; 工艺规程制定的步骤 1&#xff0e;确定生产…

齿轮和代码

背景 前几天在单元楼下&#xff0c;无意间捡到一个散板的小车&#xff0c;娃说是他的 回来后&#xff0c;好好教导了一番&#xff0c;不能高空抛物 今天&#xff0c;终于有时间坐下来修下 这种小车&#xff0c;往后拉一段距离再松手&#xff0c;就会往前一阵跑老远 在儿童玩…

tinkerCAD案例:11.制作齿轮

tinkerCAD案例&#xff1a;11.制作齿轮 制作齿轮 Add a cylinder to be the main part of the gear. 添加一个圆柱体作为齿轮的主要部分。 说明 Click and drag a cylinder onto the Workplane. 单击圆柱体并将其拖动到工作平面上。 Change the cylinder dimensions to 35mm …

齿轮动力学仿真

2K-H行星齿轮传动由于具有体积小、重量轻、速比大、效率高的特点,在民用、国防工业中都得到 了广泛的应用。近年来,国内外学者对行星齿轮传动的动态特性已经进行了大量研究[1&#xff5e; 6]。但其中绝大多数研究者在进行建模和分析时不考虑间隙的影响,采用线性振动理论研究系统…

SolidWorks齿轮设计软件工具 GearTrax介绍

SolidWorks齿轮设计软件工具 GearTrax介绍 GearTrax 是一款专业强大的齿轮设计软件工具&#xff0c;可以用于创建驱动器组件的实体模型&#xff0c;从而即可更好的帮助用户创建出具有真正渐开线齿廓的正齿轮、斜齿轮、锥齿轮、蜗轮、花键等所需要的齿轮设计。插件支持SolidWork…

齿轮建模 图片及链接

齿轮参数化建模 链接: https://pan.baidu.com/s/1n-MaweXPdjXC8aaunKggpg 提取码: pjwv 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦

opengl绘制齿轮

1. 概述 高级计算机三维建模第二次小实习&#xff0c;利用opengl在提供的基础代码上绘制完整的齿轮。绘制思路如下图&#xff1a; 2. 注意事项 对 p 0 , p 7 , p 6 , p 3 p_0,p_7,p_6,p_3 p0​,p7​,p6​,p3​这四点所组成的平面采取了三角形绘制的方式&#xff0c;绘制顺序…

c语言编程齿轮模数选择,如何画齿轮,一看就懂

马上注册&#xff0c;结交更多好友&#xff0c;享用更多功能&#xff01; 您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册 x 在网上找到的&#xff0c;昨天看了一下&#xff0c;就画出来了 齿轮的画法 一、预备知识&#xff1a; 画一个M4&#xff0c;Z…

齿轮-机械原理基础

斜齿轮比直齿轮&#xff1a;传动能力强&#xff08;接触范围大&#xff09;&#xff0c;噪音小&#xff0c;转动平稳&#xff0c;制造成本相当&#xff0c;会产生轴向力。 1.斜齿圆柱齿轮在啮合时&#xff0c;啮合接触线是由短到长再到短&#xff1b;直齿轮是整体进入啮合整体…

用SW绘制渐开线直齿圆柱齿轮

用Solidworks绘制齿轮可以使用SW里面提供的标准库&#xff0c;经过笔者实测&#xff0c;发现并不是很好用&#xff1a;&#xff09;绘制齿轮大家可能仅仅是随手画一下&#xff0c;看着像齿轮就行了&#xff0c;但是如何正确规范的绘制一个渐开线圆柱齿轮&#xff0c;并能实现3D…

使用SOLIDWORKS方程式绘制渐开线齿轮

在SOLIDWORKS中&#xff0c;有时需要在参数之间建立关联&#xff0c;但这种关联却无法通过使用几何关系或常规的建模技术来实现。这时我们就可以使用方程式来建立模型中尺寸之间的数学关系。在方程式驱动的曲线中最经典的就是渐开线了&#xff0c;这也是绘制齿轮时不可或缺的线…

简单齿轮步骤

1.首先画个圆&#xff0c;填充颜色&#xff0c;然后选择移动工具&#xff0c;选择图层&#xff0c;如果没有变换控件&#xff0c;就在左上角打开显示变换控件&#xff0c;CTRLR&#xff0c;拉辅助线&#xff0c;拉到圆的中心点&#xff0c; 2.然后用矩形工具画个矩形&#xff0…

SOLIDWORKS Simulation齿轮啮合分析

齿轮的工况如下&#xff1a;一组齿轮进行咬合&#xff0c;模拟大齿轮卡死状态&#xff0c;小齿轮轴心扭矩5N.M,材料为合金钢&#xff0c;计算此状态下&#xff0c;齿轮整体的应力分布及变形分析。使用的仿真软件为SOLIDWORKS Simulation&#xff08;此次分析为设置方法指导&…

齿轮的基本知识

齿轮是应用非常广泛的传动件,用以传递动力和运动,并具有改变转速和转向的作用。依据两齿合齿轮轴线在空间的相对位置不同,常见的齿轮传动可分为下列三种形式(图9-43): (1) 圆柱齿轮传动——有于两平行之间的传动。 (2) 圆锥齿轮传动——用于两相之间的传动。 (3) 蜗杆蜗…

工程制图-齿轮

认识齿轮 轮泵工作原理很简单&#xff0c;就是一个主动轮一个从动轮&#xff0c;两个齿轮参数相同&#xff0c;在一个泵体内做旋转运动。在这个壳体内部形成类似一个“8”字形的工作区&#xff0c;齿轮的外径和两侧都与壳体紧密配合&#xff0c;传送介质从进油口进入&#xff…

手把手教你solidworks中的齿轮配合

手把手教你solidworks中的齿轮配合 1.建立装配图&#xff0c;在装配体中导入两个齿轮。 2.把齿轮1固定改为浮动 3.如下图所示选中隐藏/显示主要基准面。 4.选中上视基准面和右视基准面&#xff0c;点击参考面之下的基准轴如下图所示。打上勾。建立基准轴后&#xff0c;点击…