魔方阵算法及C语言实现

时间:2022-09-06 19:34:54

1 魔方阵概念

魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。魔方阵也称为幻方阵

例如三阶魔方阵为:

魔方阵算法及C语言实现

魔方阵有什么的规律呢?

魔方阵分为奇幻方和偶幻方。而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。下面分别进行介绍。

2 奇魔方的算法

2.1 奇魔方的规律与算法

奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下:

  1. 数字1位于方阵中的第一行中间一列;
  2. 数字a(1 < a  ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n;
  3. 数字a(1 < a  ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为1;
  4. 如果a-1是n的倍数,则a(1 < a  ≤ n2)的行数比a-1行数大1,列数与a-1相同。

2.2 奇魔方算法的C语言实现

 #include <stdio.h>
// Author: http://furzoom.com/
// N为魔方阶数
#define N 11 int main()
{
int a[N][N];
int i;
int col,row; col = (N-)/;
row = ; a[row][col] = ; for(i = ; i <= N*N; i++)
{
if((i-)%N == )
{
row++;
}
else
{
// if row = 0, then row = N-1, or row = row - 1
row--;
row = (row+N)%N; // if col = N, then col = 0, or col = col + 1
col ++;
col %= N;
}
a[row][col] = i;
}
for(row = ;row<N;row++)
{
for(col = ;col < N; col ++)
{
printf("%6d",a[row][col]);
}
printf("\n");
}
return ;
}

3 偶魔方的算法

偶魔方的情况比较特殊,分为阶数n = 4 * m(m =1,2,3……)的情况和阶数n = 4 * m + 2(m = 1,2,3……)情况两种。

3.1 阶数n = 4 * m(m =1,2,3……)的魔方(双偶魔方)

算法1:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:

  1. 按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充;
  2. 将魔方中间n/2列的元素上、下进行翻转;
  3. 将魔方中间n/2行的元素左、右进行翻转。

C语言实现

 #include <stdio.h>
// Author: http://furzoom.com/
// N为魔方阶数,
#define N 12 int main()
{
int a[N][N];//存储魔方
int i, temp;//临时变量
int col, row;//col 列,row 行 //初始化
i = ;
for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
a[row][col] = i;
i++;
}
} //翻转中间列
for(row = ; row < N/; row ++)
{
for(col = N/;col < N/*;col ++)
{
temp = a[row][col];
a[row][col] = a[N-row-][col];
a[N-row-][col] = temp;
}
} //翻转中间行
for(col = ; col < N/; col ++)
{
for(row = N/;row < N/ * ;row ++)
{
temp = a[row][col];
a[row][col] = a[row][N-col-];
a[row][N-col-] = temp;
}
} for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
printf("%5d",a[row][col]);
}
printf("\n");
}
return ;
}

算法2:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:

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

C语言实现

 #include <stdio.h>
// Author: http://furzoom.com/
// N为魔方阶数
#define N 12 int main()
{
int a[N][N];//存储魔方
int temparray[N*N/];//存储取出的元素
int i;//循环变量
int col, row;// col 列,row 行 //初始化
i = ;
for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
a[row][col] = i;
i++;
}
}
//取出子方阵中对角线上的元素,且恰好按从小到大的顺序排放
i = ;
for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
if((col % == row % ) || ( == ( col % + row % )))
{
temparray[i] = a[row][col];
i++;
}
}
}
//将取出的元素按照从大到小的顺序填充到n×n方阵中
i = N*N/ -;
for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
if((col % == row % ) || ( == ( col % + row % )))
{
a[row][col] = temparray[i];
i--;
}
}
}
//输出方阵
for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
printf("%5d",a[row][col]);
}
printf("\n");
}
return ;
}

3.2 阶数n = 4 * m + 2(m =1,2,3……)的魔方(单偶魔方)

算法

设k = 2 * m + 1;单偶魔方是魔方中比较复杂的一个。

  1. 将魔方分成A、B、C、D四个k阶方阵,如下图魔方阵算法及C语言实现这四个方阵都为奇方阵,利用上面讲到的方法依次将A、D、B、C填充为奇魔方。
  2. 交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素;对其他行,交换从左向右m列各对应元素。
  3. 交换B、D魔方元素,交换从中间列向左m – 1列各对应元素。

C语言实现

#include <stdio.h>
// Author: http://furzoom.com/
// N为魔方阶数
#define N 10 int main()
{
int a[N][N] = { {} };//存储魔方
int i,k,temp;
int col,row;// col 列,row 行 //初始化
k = N / ;
col = (k-)/;
row = ;
a[row][col] = ;
//生成奇魔方A
for(i = ; i <= k*k; i++)
{
if((i-)%k == )//前一个数是3的倍数
{
row++;
}
else
{
// if row = 0, then row = N-1, or row = row - 1
row--;
row = (row+k)%k; // if col = N, then col = 0, or col = col + 1
col ++;
col %= k;
}
a[row][col] = i;
} //根据A生成B、C、D魔方
for(row = ;row < k; row++)
{
for(col = ;col < k; col ++)
{
a[row+k][col+k] = a[row][col] + k*k;
a[row][col+k] = a[row][col] + *k*k;
a[row+k][col] = a[row][col] + *k*k;
}
} // Swap A and C
for(row = ;row < k;row++)
{
if(row == k / )//中间行,交换从中间列向右的m列,N = 2*(2m+1)
{
for(col = k / ; col < k - ; col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
else//其他行,交换从左向右m列,N = 2*(2m+1)
{
for(col = ;col < k / ;col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
} // Swap B and D
for(row = ; row < k;row++)//交换中间列向左m-1列,N = 2*(2m+1)
{
for(i = ;i < (k - )/ - ;i++)
{
temp = a[row][k+ k/ - i];
a[row][k+ k / -i] = a[row + k][k+k/ -i];
a[row + k][k+k/ -i] = temp;
}
} //输出魔方阵
for(row = ;row < N; row++)
{
for(col = ;col < N; col ++)
{
printf("%5d",a[row][col]);
}
printf("\n");
} return ;
}

==========================================》

你若要放弃,那我就可以安慰自己了,因为这样我不再孤独了,可以参考能够不断往前走,成功难道不是早晚的是事吗?

魔方阵算法及C语言实现的更多相关文章

  1. 任意阶魔方阵(幻方)的算法及C语言实现

    写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍 ...

  2. C语言——打印魔方阵(每一行,每一列,对角线之和相等)

    <一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8   1   6 3   5   7 4   9 ...

  3. n阶魔方阵(奇数阵)的输出

    需求 要求输出1~n²的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称“纵横图”,是指组成元素为自然数1.2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主 ...

  4. 一个UUID生成算法的C语言实现 --- WIN32版本 &period;

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

  5. 无限大整数相加算法的C语言源代码

    忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里. 500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒. 下面是 ...

  6. 数据结构算法集---C&plus;&plus;语言实现

    //数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...

  7. 【2&lpar;2N&plus;1&rpar;魔方阵 】

    /* 2(2N+1)魔方阵 */ #include<stdio.h> #include<stdlib.h> #define N 6 #define SWAP(x, y) {in ...

  8. 1164&colon; 零起点学算法71——C语言合法标识符(存在问题)

    1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 10 ...

  9. 【最全】经典排序算法(C语言)

    算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...

随机推荐

  1. Android 上传图片并添加参数 PHP接收

    php端接收代码: public function get_file(){ $local_path = "./Public/daixu_picture/figure/";//服务器 ...

  2. &lbrack;手机取证&rsqb; Jonathan Zdziarski公开的苹果iOS后门及POC视频

    Jonathan Zdziarski 近日在其推特上公布了此“后门”的研究及POC视频,并表示全球媒体“夸大”了此事,自己“从未表示过认为此后门与NSA的监控行为有关”. 视频 http://pan. ...

  3. POJ2796Feel Good&lbrack;单调栈&rsqb;

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13376   Accepted: 3719 Case T ...

  4. LeetCode -- Word Break 动态规划,详细理解

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  5. HTML5 LocalStorage 本地存储总结

    存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.a 或者 window.localStorage["a"] ...

  6. MySQL数据库—日期与时间函数

    一. 日期和时间函数 函数的概念:按指定格式输入参数,返回正确结果的运算单元 1. 返回当前日期:curdate() current_date() current_date()+0可以将当前日期转换为 ...

  7. UOJ&num;347&period; 【WC2018】通道 边分治 虚树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ347.html 题意 有三棵树,边有边权. 对于所有点对 (x,y) 求在三棵树上 x 到 y 的距离之和 ...

  8. 19LaTeX学习系列之---LaTeX的总结

    目录 目录 前言 (一)本系列的章节目录 (二)快速温习LaTeX 1.介绍 2.源文件结构 3.文档的结构 4.字体的设置 5.图片的插入 6.表格的插入 7.数学公式的插入 8.交叉引用与浮动体 ...

  9. &lbrack;Umbraco&rsqb; macro&lpar;宏&rpar;在umbraco中的作用

    macro在umbraco中是一个核心的应用,它是模板页中用于动态加载内容的标签(模板指令),宏可以是基于XSLT文件创建,亦可以是基于ASP.NET用户控件创建 在develop下的Macros中创 ...

  10. 修改hosts,&ast;&ast;&ast;

    某些网站之所以在国内上不了,是因为dns受到干扰,无法解析出正确的ip地址. 可以在hosts文件中加入网站对应的正确ip地址,进行访问. 1.打开hosts文件,  路径为 C:\Windows\S ...