iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言魔方阵的三种实现方法
  • 418
分享到

C语言魔方阵的三种实现方法

2024-04-02 19:04:59 418人浏览 泡泡鱼
摘要

目录魔方阵:1.奇数阶魔方阵 2.偶数阶魔方阵 (n=4K)3.偶数阶魔方阵 (n=4K+2)魔方阵: 把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相

魔方阵:

把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 ROW
	int 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 ROW
	assert(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;
}

结果: 

到此这篇关于C语言魔方阵的三种实现方法的文章就介绍到这了,更多相关C语言魔方阵内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言魔方阵的三种实现方法

本文链接: https://www.lsjlt.com/news/159305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言魔方阵的三种实现方法
    目录魔方阵:1.奇数阶魔方阵 2.偶数阶魔方阵 (n=4K)3.偶数阶魔方阵 (n=4K+2)魔方阵: 把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相...
    99+
    2022-11-12
  • C语言魔方阵的实现方法有哪些
    这篇文章主要介绍C语言魔方阵的实现方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!魔方阵:把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相同,即为n阶魔方阵。根据魔方阵的规律,我...
    99+
    2023-06-21
  • C语言杨辉三角两种实现方法
    目录杨辉三角——C语言实现方法一:利用二维数组实现方法二(对方法一的改进): 总结杨辉三角——C语言实现 杨辉三角: 在屏幕上打印杨辉三角。 1 1 1 1 2 1 1 3 3 1...
    99+
    2022-11-12
  • C语言实现打印杨辉三角的方法详细(三种方法)
    目录题目描述问题分析1. 使用数组法(打印直角三角)2. 使用数组法(打印等腰三角)3. 使用公式法(打印等腰三角)网上参考题目描述 打印杨辉三角(前N行) 问题分析 杨辉三角是中国...
    99+
    2022-11-12
  • C语言中杨氏矩阵与杨辉三角的实现方法
    一、杨氏矩阵 杨氏矩阵 1.杨氏矩阵的概念 在数学中,杨表(英语:Young tableau),又称杨氏矩阵。是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述...
    99+
    2022-11-12
  • C语言函数调用的三种实现方法实例
    目录C语言函数第一种方法第二种方法第三种方法总结C语言函数 1.概念:函数是一组一起执行一个任务的语句,每个c程序都必须有一个main函数,程序员可以把代码划分到不同的函数当中去,在...
    99+
    2022-11-13
  • C语言实现求最大公约数的三种方法
    目录题目描述问题分析代码实现方法一:穷举法方法二:辗转相除法方法三:更相减损法题目描述 求任意两个正整数的最大公约数 问题分析 最大公因数,也称最大公约数、最大公因子,指两个或多个整...
    99+
    2022-11-12
  • C语言杨氏矩阵简单实现方法
    今天来向大家介绍一个用C语言实现杨氏矩阵的问题。题目如下: 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。 要求:时...
    99+
    2023-02-01
    C语言杨氏矩阵 C语言杨氏矩阵实现
  • C语言中斐波那契数列的三种实现方式(递归、循环、矩阵)
    目录一、递归二、循环三、矩阵《剑指offer》里讲到了一种斐波那契数列的 O(logN) 时间复杂度的实现,觉得挺有意思的,三种方法都记录一下。 一、递归    ...
    99+
    2022-11-13
  • C语言中栈的两种实现方法
    栈的两种实现方式 通常情况下,栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组。但是在调用程序时,我们没有必要知道具体使用了哪种方法。 一、顺序栈 #inclu...
    99+
    2022-11-12
  • Go语言实现超时的三种方法实例
    目录前言方法一:用两个通道 + A协程sleep方法二:使用Timer(定时器)方法三:使用context.WithTimeout附:go 实现超时退出总结前言 超时,指一个协程A开...
    99+
    2022-11-13
  • 详解C语言快速排序三种方法的单趟实现
    目录交换排序的思想冒泡排序的思想快速排序的整体框架快速排序单趟实现逻辑1. hoare版本单趟实现(左右指针法)2.挖坑法单趟排序实现3.前后指针法交换排序的思想 基本思想:所谓交换...
    99+
    2022-11-13
  • C语言实现短字符串压缩的三种方法详解
    目录前言一、通用算法的短字符压缩二、短字符串压缩(1)Smaz(2)Shoco(3)Unisox2三、总结前言 上一篇探索了LZ4的压缩和解压性能,以及对LZ4和ZSTD的压缩、解压...
    99+
    2022-11-13
    C语言短字符串压缩 C语言 字符串压缩
  • C语言通过三种方法实现属于你的通讯录
    目录一、基础版本1.1 通讯录的个人信息(结构体来实现)1.2通讯录名单1.3人员初始化1.4菜单1.5主函数二、功能的实现2.1、增加人数2.2、删除人数2.3、查找2.4、展示2...
    99+
    2022-11-21
    C语言实现通讯录 C语言 通讯录
  • C语言实现三子棋游戏的方法
    本篇内容介绍了“C语言实现三子棋游戏的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言提示:是黑白棋的一种。三子棋是一种民间传统游戏,...
    99+
    2023-06-20
  • C语言实现计算器的两种方法
    本文实例为大家分享了C语言实现计算器的具体代码,供大家参考,具体内容如下 C语言计算器两种方法 //一般做法 #include<stdio.h> #include<...
    99+
    2022-11-13
  • R语言创建矩阵的实现方法
    矩阵 向量vector用于描述一维数据,是R语言中最基础的数据结构形式 矩阵matrix可以描述二维数据,和向量相似,其内部元素可以是实数、复数、字符、逻辑型数据 矩阵...
    99+
    2022-11-11
  • 纯c语言优雅地实现矩阵运算库的方法
    目录1.一个优雅好用的c语言库必须满足哪些条件2.实现一个矩阵运算库的几点思考(1)采用预定义的数据类型,避免直接使用编译器定义的数据类型(2)基于对象编程,定义矩阵对象(3)除了特...
    99+
    2022-11-12
  • C语言实现魔方比赛管理系统
    本文实例为大家分享了C语言实现魔方比赛管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h>...
    99+
    2022-11-13
  • C语言中栈的两种实现方法详解
    目录一、顺序栈二、链式栈总结一、顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作