C语言:魔方阵-全(图解+代码+结果输出)

2023-05-16

目录

前言

一、奇数阶阵(n = 2k + 1)

结果输出:

二、偶数阶阵(n = 2k)

一、四倍偶数阶阵(n = 4k)

结果输出:

二、非四倍偶数阶阵(n = 4k + 2)

结果输出:


前言

​​​​​​​魔方阵,古代又称"纵横图",是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

一、奇数阶阵(n = 2k + 1)

奇数魔方阵的排列规律如下(此处以3阶阵为例):

⑴将1放在第一行中间一列;

⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);

⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

以下为代码实现:

#define ROW 3
#define COL ROW

	int arr[ROW][COL] = { 0 };

	int currow = 0;
	int curcol = COL / 2;
	arr[0][curcol] = 1;//将1放于第一行中间

	for (int i = 2; i <= ROW * COL; i++)
	{
        //判断上一行下一列是否存在元素
		if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] != 0)
		{
            //存在元素,将位置挪位现位置的底下
			currow = (currow + 1) % ROW;
		}
		else
		{
            //不存在元素,挪位至现位置上一行下一列
			currow = (currow - 1 + ROW) % ROW;
			curcol = (curcol + 1) % COL;
		}
		arr[currow][curcol] = i;//为确定的位置赋值
	}

    //输出
    for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%-4d", arr[i][j]);
		}
		printf("\n");
	}

#undef ROW
#undef COL

结果输出:

二、偶数阶阵(n = 2k)

偶数阶阵存在两种情况,一种为可被4整除,一种为不能被4整除;

接下来将分开解析两种问题:

一、四倍偶数阶阵(n = 4k)

四倍偶数阶阵的排列规律如下(此处以4阶阵为例):

    (1) 先将整个方阵划分成k* k个4阶方阵,然后在每个4阶方阵的对角线上做记号
    (2) 由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1
    (3) 自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1

注:下列四倍偶数阶阵代码实现时,采取先全部顺序赋值,而后逆顺序对位于对角线上的元素赋值

此类型较为简单,只需注意对角线的分析:

#define ROW 4 
#define COL ROW

	int arr[ROW][COL] = { 0 };

    //先按从左到右,从上至下的顺序依次赋值
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			arr[i][j] = i * COL + j + 1;
		}
	}

	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
            //对每个4*4方阵的对角线位置进行重新赋值
			if (i % 4 == j % 4 || i % 4 + j % 4 == 3)
			{
				arr[i][j] = ROW * COL - i * COL - j;
			}
		}
	}

    //输出
    for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%-4d", arr[i][j]);
		}
		printf("\n");
	}

#undef ROW
#undef COL

结果输出:

二、非四倍偶数阶阵(n = 4k + 2)

四倍偶数阶阵的排列规律如下(此处以6阶阵为例):

6阶阵即为四个3阶阵的组合(图中标红即为换位元素)

 本法填制魔方阵时,先将整个方阵划成田字型的四个2 k + 1阶的奇数阶小方阵,并以下法做注记:

(1)右半两个小方阵中大于k+2的列。

(2)左半两个小方阵中( k + 1 , k + 1 )的格位。

(3)左半两个小方阵中除了( 1 , k + 1 )是指第一列第 k+1行 的格位之外,小于k +1的列。

以奇数阶魔方阵的方法连续填制法依左上、右下、右上、左下的顺序分别填制这四个小方阵。

将上半及下半方阵中有注记的数字对调(代码实现时无需注记,只需要理清交换位置即可),魔方阵完成。

#define ROW 6
#define COL ROW

	int arr[ROW][COL] = { 0 };

	int currow = 0;
	int curcol = COL / 4;
	arr[currow][curcol] = 1;

	//左上
	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);
		}
		else
		{
            //不存在元素,挪位至现位置上一行下一列
			currow = (currow - 1 + (ROW / 2)) % (ROW / 2);
			curcol = (curcol + 1) % (COL / 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] + ROW * COL / 4;
		}
	}

	//右上
	currow = 0;
	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] + ROW * COL / 2;
		}
	}

	//左下
	currow = ROW / 2;
	for (int i = 0; i < ROW / 2; i++, currow++)
	{
		curcol = 0;
		for (int j = 0; j < COL / 2; j++, curcol++)
		{
			arr[currow][curcol] = arr[i][j] + ROW * COL / 4 + ROW * COL / 2;
		}
	}

	//  1, 右半两个小方阵中大于k + 2的列。进行上下交换
	//k = COL / 4, 右半边k = COL / 2 + COL / 4
	//右半边大于 k + 2 = COL / 2 + COL / 4 + 2
	for (int j = COL / 2 + COL / 4 + 2; j < COL; j++)
	{
		for (int i = 0; i < ROW / 2; i++)
		{
			int temp = arr[i][j];
			arr[i][j] = arr[i + ROW / 2][j];
			arr[i + ROW / 2][j] = temp;
		}
	}

	//	2,左半两个小方阵中(k + 1, k + 1)的格位。
	//  即两个方块中心点进行交换
	int temp = arr[ROW / 4][COL / 4];
	arr[ROW / 4][COL / 4] = arr[ROW / 4 + ROW / 2][COL / 4];
	arr[ROW / 4 + ROW / 2][COL / 4] = temp;

	//	3,左半两个小方阵中除了(1, k + 1)是指第一列第k + 1行的格位之外,小于k + 1的列。
	//  即小于 k + 1 的列上下交换,除了中心行的第一个值
	for (int i = 0; i < ROW / 2; i++)
	{
		for (int j = 0; j < COL / 4; j++)
		{
			if (i == ROW / 4 && j == 0)
			{
				continue;
			}
			int temp = arr[i][j];
			arr[i][j] = arr[i + ROW / 2][j];
			arr[i + ROW / 2][j] = temp;
		}
	}

    //输出
    for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%-4d", arr[i][j]);
		}
		printf("\n");
	}

#undef ROW
#undef COL

结果输出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言:魔方阵-全(图解+代码+结果输出) 的相关文章

随机推荐

  • 程序员编程艺术:第四章、现场编写类似strstr/strcpy/strpbrk的函数

    第四章 现场编写类似strstr strcpy strpbrk的函数 前奏 有网友向我反应 xff0c 之前三章 xff08 http t cn hgVPmH xff09 的面试题目 xff0c 是否有点太难了 诚如他所说 xff0c 绝大
  • 从头到尾彻底理解KMP(2014年8月22日版)

    从头到尾彻底理解KMP 作者 xff1a July 时间 xff1a 最初写于2011年12月 xff0c 2014年7月21日晚10点 全部删除重写成此文 xff0c 随后的半个多月不断反复改进 后收录于新书 编程之法 xff1a 面试和
  • 基于HAL的嵌入式学习(STM32F407)——点亮你的LED

    前言 本人通过自身的一些学习 xff0c 通过使用CubeMX来完成嵌入式学习过程中的硬件配置 xff0c 结合使用Keil5来进行程序编写 xff0c 进而完成对于工程目标的编程问题 硬件介绍 xff1a 本人使用的是一款芯片为STM32
  • Docker入门(二) - 容器内访问宿主机硬件资源

    https blog csdn net tianhuanqingyun article details 91580778 边缘设备而言 xff0c 在支持容器化运行的条件下 xff0c 需要在容器内获取宿主机的硬件资源 xff0c 完成与宿
  • jQuery使用prop属性全选与取消全选

    jQuery使用prop属性全选与取消全选 在使用jQuery开发全选或取消全选时 xff0c 用 attr 34 checked 34 获取 checkbox 的 checked属性时 如果是选中状态可以取到值 但是在未选中的时候获取值就
  • angularjs笔记

    基础概念 ng app 指令告诉 AngularJS xff0c 元素是 AngularJS 应用程序 的 34 所有者 34 ng model 指令把输入域的值绑定到应用程序变量 name ng bind 指令把应用程序变量 name 绑
  • virtualbox已有虚拟硬盘扩容(不修改原有数据)

    virtualbox为ubuntu添加虚拟硬盘 大概的步骤如下 xff1a 在virtualbox上注册一个虚拟硬盘使用fdisk对硬盘进行分区mkfs ext4格式化硬盘修改uuid VBoxManage internalcommands
  • react资源

    MUI The React UI library for faster and easier web development React Table Lightweight and extensible data tables for Re
  • gitbook之node版本问题

    执行gitbook build出现错误 xff0c 执行gitbook serve也是会出错 错误如下 xff1a gitbook build usr local lib node modules gitbook cli node modu
  • 结构体定义寄存器方法(很流行哦)

    ARM寄存器数量之多 xff0c 叹为观止 xff01 幸运的是 xff0c 它都是以模块分布 xff0c 再依托C语言的模块化编程 xff0c 用户就没有必要记忆那么多的寄存器名称了 xff01 拿LPC1114来说 xff0c 单片机内
  • Arduino Uno安装设备时,出现了一个错误,这个INF中的服务安装段落无效

    问题 xff1a 在windows系统下 xff0c Uno安装设备时 xff0c 出现了一个错误 xff0c 这个INF中的服务安装段落无效 原因 xff1a 缺少系统文件 解决方案 xff1a 1 先下载 xff1a usbser zi
  • Vmware Unity模式

    ubuntu 12 04 之Vmware Unity模式 安装VMware Toolsudo add apt repository ppa gnome3 team gnome3sudo apt get install gnome shell
  • 状态机实现的三种方法-C语言

    1 参考 xff1a https www cnblogs com aaronLinux p 5705457 html 2 转载 xff1a http kb cnblogs com page 528972 3 参考 xff1a FSM TCP
  • 代码函数调用关系图

    代码函数调用关系 Graphviz 43 CodeViz http www linuxidc com Linux 2015 01 111501 htmCallgraph xff1a 静态分析 C 程序函数调用关系图cflow 43 grap
  • 错误:try using -rpath or -rpath-link

    在使用到动态库的时候 xff0c 出现错误如下 xff1a arm linux bin span class hljs keyword ld span warning libssl span class hljs preprocessor
  • Nestjs框架安装与启动

    Nest是构建高效可扩展的 Node js Web 应用程序的框架 默认使用JavaScript的超集TypeScript进行开发 环境准备 查看node和npm版本 node version v10 11 0 npm version 6
  • Vcpkg安装指定版本包或自定义安装包

    文章目录 前言寻找版本安装后话 前言 windows一直用着vcpkg作为C 43 43 跨平台开发的包管理 xff0c 有些依赖要指定版本库 xff0c vcpkg目前最新的openssl版本是3 1 0 xff0c 我想安装其他版本为例
  • git push不用输入密码(方法一)-git-credentials

    install git credentials sh 命令步骤 xff1a touch git credentialsecho 34 http username password 64 localhost 34 gt gt git cred
  • PCIe 配置空间:Status 寄存器

    1 Status 寄存器位置 2 Status 寄存器细节 2 1 特殊位 对于 PCIe 设备 xff0c status 寄存器中有几个 bit 的值是固定的 Bit 4 xff1a Capability List xff0c 该位必须为
  • C语言:魔方阵-全(图解+代码+结果输出)

    目录 前言 一 奇数阶阵 xff08 n 61 2k 43 1 结果输出 xff1a 二 偶数阶阵 xff08 n 61 2k 一 四倍偶数阶阵 xff08 n 61 4k 结果输出 xff1a 二 非四倍偶数阶阵 xff08 n 61 4