魔方阵的实现(三种情况)

article/2025/8/29 9:09:50

魔方阵:把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相同,即为n阶魔方阵。

根据魔方阵的规律,我将它分为三种情况。

1.奇数阶魔方阵 

规律:第一个数放在第一行的中间,下一个数放在上一个数的上一行下一列,若该位置已经有了数字即放在上个数的下面一行的相同列

用C语言编程如下:

示例:n=5;

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>void Magic1()
{
#define ROW 5
#define COL ROW
assert(ROW % 2 != 0);  //判断n是否为奇数int arr[ROW][COL] = { 0 }; //定义二维数组int currow = 0;
int curcol = COL / 2;
arr[currow][curcol] = 1;
for (int i = 2; i <= ROW * COL; i++) 
{if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] == 0) //按照规律赋值{currow = (currow - 1 + ROW) % ROW;curcol = (curcol + 1) % COL;}else {currow = (currow + 1) % ROW;}arr[currow][curcol] = i;
}for (int i = 0; i < ROW; i++)  //打印魔方阵
{for (int j = 0; j < COL; j++){printf("%-3d", arr[i][j]);}printf("\n");
}}
int main()
{Magic1();return 0;
}

结果:

2.偶数阶魔方阵 (n=4K)

规律:按数字从小到大,即1,2,3……n顺序对魔方阵从左到右,从上到下进行填充;
将魔方阵分成若干个4×4子方阵(如:8阶魔方阵可分成四个4×4子方阵),将子方阵对角线上的元素取出;将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//偶数魔方阵 4K 
void Magic2()
{
#define ROW 8
#define COL ROWint tmp = 1;int arr[ROW][COL] = { 0 };  //定义二维矩阵for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++){arr[i][j] = tmp++;}}int row1 = 1;int col1 = 1;int row2 = 1;int col2 = 1;for (int i = 0; i < (ROW / 4) ; i++){for (int j = 0; j < (COL / 4); j++){row1 = 4 * i;col1 = 4 * j;row2 = 4 * i;col2 = 4 * j + 3;for (int k = 0; k < 4; k++){arr[row1][col1] = (ROW * COL + 1) - arr[row1][col1];arr[row2][col2] = (ROW * COL + 1) - arr[row2][col2];row1++;col1++;row2++;col2--;}}}for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){printf("%-3d", arr[i][j]);}printf("\n");}}
int main()
{Magic2();return 0;
}

结果: 

3.偶数阶魔方阵 (n=4K+2)

规律:

3.1.填充规则

将魔方分成A、B、C、D四个k阶奇方阵, 利用奇数魔方阵填充方法依次将A、D、B、C填充 。

3.2.交换规则      上下标记的数字进行交换
        1.右半边大于k+2的列(从1开始)
        2.左半边,上下两个块最中心的点进行交换
        3.左半边小于中心列的列(除了上下半边最中心的行的第一列的那个值不用交换)(从1开始)

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>void Magic3()
{
#define ROW 10 
#define COL ROWassert(ROW % 2 == 0 && ROW % 4 != 0);int arr[ROW][COL] = { 0 };//左上角int currow = 0;int curcol = ROW/4;arr[currow][curcol] = 1;int tmp = 0;for (int i = 2; i <= ROW * COL/ 4; i++){if (arr[(currow - 1 + ROW / 2) % (ROW / 2)][(curcol + 1) % (COL / 2)] == 0)  //判断上一行下一列是否被赋值{currow = (currow - 1 + ROW / 2) % (ROW / 2);curcol = (curcol + 1) % (COL / 2);}else{currow = (currow + 1) % (ROW / 2);}arr[currow][curcol] = i;}//右下角currow = ROW / 2;for (int i = 0; i < ROW / 2; i++, currow++){curcol = COL / 2;for (int j = 0; j < COL / 2; j++, curcol++){	arr[currow][curcol] = arr[i][j] + 9;}}//右上角currow = 0;for (int i = ROW/2; i < ROW ; i++, currow++){curcol = COL / 2;for (int j = COL/2; j < COL; j++, curcol++){	arr[currow][curcol] = arr[i][j] + 9;}}//左下角currow = ROW / 2;for (int i = 0; i < ROW/2; i++, currow++){curcol = 0;for (int j = COL/2; j < COL; j++, curcol++){arr[currow][curcol] = arr[i][j] + 9;}}//替换规则1:右半边 大于k+2的列  进行上下交换for (int i = 0; i < ROW / 2; i++){for (int j = ROW / 2 + ROW / 4 + 2; j < COL; j++){tmp = arr[i][j];arr[i][j] = arr[i + ROW / 2][j];arr[i + ROW / 2][j] = tmp;}}//替换规则2:交换左半边,两个中心节点currow = ROW / 4;curcol = COL / 4;tmp = arr[currow][curcol];arr[currow][curcol] = arr[currow + ROW / 2][curcol];arr[currow + ROW / 2][curcol] = tmp;//替换规则3:左半边,除(K+1,1)这个点外,小于k+1的列  上下交换for (int j = 0; j < ROW / 4; j++) //表示交换的列{for (int i = 0; i < ROW / 2; i++) //表示交换的行{if (i == ROW / 4 && j == 0){continue;}else{tmp = arr[i][j];arr[i][j] = arr[i + ROW / 2][j];arr[i + ROW / 2][j] = tmp;}}}//打印for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){printf("%-3d", arr[i][j]);}printf("\n");}
}int main()
{Magic3();return 0;
}

结果: 


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

相关文章

经典算法:魔方阵(奇数)

魔方阵的说明&#xff1a; 将1到n(为奇数)的数字排列在n*n的方阵上&#xff0c;且各行、各列与各对角线的和必须相同 此篇文章只讲如何编写奇数阶魔方阵 规律&#xff1a; ⑴ 将1放在第一行中间一列 ⑵ 从2开始直到nn止各数依次按下列规则存放&#xff1a; 每一个数存放的行…

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

魔方阵的构造 描述&#xff1a;由n*n个数字所组成的n阶方阵&#xff0c;若具有各对角线、各横列与纵行的数字和都相等的性质&#xff0c;则称为魔方阵。 这个相等的和称为魔术数字。若填入的数字是从1到n*n&#xff0c;称此种魔方阵为n阶正规魔方阵。 如下所示为一个3阶魔方阵…

《齿轮制作》

新建一个画板&#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) 蜗杆蜗…