魔方阵算法

输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
      8 1 6
      3 5 7
      4 9 2
要求输出1~n*n的自然数构成的魔方阵。

解:魔方阵中各数的排列规律如下:

(1)将1放在第1行的中间一列。

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

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

(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1,例如,2在第3行最后一列,则3应放在第二行第一列

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

下面。由于6是第1行第3列(即最后一列),故7放在6下面。按此方法可以得到任何阶的魔方阵。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define MIN 1
 4 #define MAX 20
 5 #define EMPTY 0
 6
 7 signed main()
 8 {
 9     int magic_square[MAX][MAX]={EMPTY};
10     int n;
11
12     printf("请输入阶数(1~15之间的奇数):");
13     scanf("%d",&n);
14     if( n<MIN || n>MAX || !(n%2) ) printf("输入错误,请重新输入!\n");
15     else{
16         int num;
17         const int _begin=1,_end=n*n;
18         int row,col;
19         for(num=_begin; num<=_end; num++){
20             if( num==_begin ){
21                 row=0;
22                 col=n/2;
23             }
24             else{
25                 int row_n=(row-1+n)%n;
26                 int col_n=(col+1)%n;
27                 if( magic_square[row_n][col_n]!=EMPTY ){
28                     row++;
29                 }
30                 else{
31                     row=row_n;
32                     col=col_n;
33                 }
34             }
35             magic_square[row][col]=num;
36         }
37     }
38     int row,col;
39     for(row=0;row<n;row++){
40         for(col=0;col<n;col++){
41             printf("%5d",magic_square[row][col]);
42         }
43         printf("\n");
44     }
45     return 0;
46 }

原文地址:https://www.cnblogs.com/wsy107316/p/12293995.html

时间: 2024-10-10 05:30:20

魔方阵算法的相关文章

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

写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍数但不是4的倍数)情况一直找不到明确的算法,就连百度百科对这一问题的解释也是“因非四的倍数作法相当复杂,在此只介绍四的倍数的作法”,而且连谭浩强那本书给的答案中竟然也变相的限定了n只能为奇数(题目并未说明).在广泛查找资料后,发现了一篇由中南大学信息科学与工程学院某教授和研究生撰写的论文,介绍了任意阶幻方的算

基本算法——for循环的使用之魔方阵实现

魔方阵,是一种每一行.每一列以及对角线的和相等. 魔方阵的一种特性是: 1.第一个元素1的位置始终在第一行正中. 2.下一个元素的位置总是在刚插入位置的右上方. 3.如果右上方的位置超出方阵上边界,则新的位置应取列的最下位置. 4.如果右上方的位置超出方阵右边界,则新的位置应取行的最座位置. 5.若刚插入的元素为n的整数倍,则选刚插入元素位置的下一行同列插入下一元素. 实现代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #def

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

需求 要求输出1~n2的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. STEP 2 魔方阵的规律是什么? 此处先写简单一点的奇阶魔方阵,偶数阶的算法更复杂,暂不讨论. 奇阶魔方阵的排列方法: ⑴将1放在第一行中间一列: ⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1: ⑶如果上

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

<一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8   1   6 3   5   7 4   9   2 每一行之和:8+1+6=15: 3+5+7=15: 4+9+2=15: 每一列之和:8+3+4=15: 1+5+9=15: 6+7+2=15: 对角线之和:8+5+2=15: 6+5+4=15: <三>魔方阵计算规律(行,列以1开始): 1.将“1”放在第一行,中间一列: 2.从2开始至N

数据结构设计——魔方阵【绝对整理清楚】

魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m*m的数字(m为奇数),使得每一行.每一列.每条对角线的累加和都相等,如下图所示: 程序: #include<stdio.h> #include<stdlib.h> #include<string.h> #define M 100 int main() { int a[M][M]; memset(a,0,sizeof(0)); int x,y,k,m; printf("输入阶数:");

C++求所有的三阶魔方阵(深度优先探索)

#include <iostream> #define DefaultSize 9 using namespace std; class Grial { public: Grial(int sz=DefaultSize) { visted = new bool [sz]; data = new int [sz]; size = sz; for(int i=1;i<=sz;i++) { visted[i]=0; } } bool check(int a[]) { if( ((data[1]

26.魔方阵问题

规律性递归 完整代码 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 void magic(int **pp, int n) 6 { 7 int i = 0; 8 //中间位置 9 int j = (n - 1) / 2; 10 int key = 1; 11 //定义第一个元素的值 12 pp[i][j] = key; 13 14 while (key < n*

C语言复习---输出魔方阵

一:奇魔方阵 算法: 1.第一个元素放在第一行中间一列 2.下一个元素存放在当前元素的上一行.下一列. 3.如果上一行.下一列已经有内容,则下一个元素的存放位置为当前列的下一行. 在找上一行.下一行或者下一列的时候,必须把这个矩阵看成是回绕的. 算法实现: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAXSIZE 100

java 经典算法(转)

1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇后 9.Algorithm Gossip: 八枚银币. 10.Algorithm Gossip: 生命游戏. 11.Algorithm Gossip: