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*n)
 15     {
 16         //如果在右上边界,则下一个自增
 17         if (i - 1 < 0 && j + 1 >= n)
 18         {
 19             i++;
 20             pp[i][j] = ++key;
 21             continue;
 22         }
 23         //如果在第一行,下一个数据跳到最后一行填充
 24         if (i - 1 < 0)
 25         {
 26             i = n - 1;
 27         }
 28         //否则往上移一行
 29         else
 30         {
 31             i--;
 32         }
 33
 34         //如果在最后一列,下一个数据跳到第一列填充
 35         if (j + 1 >= n)
 36         {
 37             j = 0;
 38         }
 39         //否则跳到下一列
 40         else
 41         {
 42             j++;
 43         }
 44
 45         //如果没有数据
 46         if (pp[i][j] == -1)
 47         {
 48             //赋值
 49             pp[i][j] = ++key;
 50         }
 51         //如果有数据则跳到下面两行,列数往前移动1
 52         else
 53         {
 54             i += 2;
 55             j--;
 56             pp[i][j] = ++key;
 57         }
 58     }
 59 }
 60
 61
 62
 63
 64 void main()
 65 {
 66     int n;
 67     scanf("%d", &n);
 68     //n必须是基数
 69     if (n % 2 == 0)
 70     {
 71         printf("无效");
 72         getchar();
 73         getchar();
 74         return;
 75     }
 76
 77     //分块数组
 78     int **pp = (int **)malloc(sizeof(int*)*n);
 79     for (int i = 0; i < n; i++)
 80     {
 81         pp[i] = (int *)malloc(sizeof(int)*n);
 82     }
 83
 84     //初始化
 85     for (int i = 0; i < n; i++)
 86     {
 87         for (int j = 0; j < n; j++)
 88         {
 89             //数据清空
 90             pp[i][j] = -1;
 91         }
 92     }
 93     //计算
 94     magic(pp, n);
 95     //输出
 96     for (int i = 0; i < n; i++)
 97     {
 98         for (int j = 0; j < n; j++)
 99         {
100             //数据清空
101             printf("%3d", pp[i][j]);
102         }
103         printf("\n");
104     }
105
106     system("pause");
107 }

原文地址:https://www.cnblogs.com/xiaochi/p/8525302.html

时间: 2024-11-08 09:34:53

26.魔方阵问题的相关文章

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

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

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

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

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

魔方阵算法

输出"魔方阵".所谓魔方阵是指这样的方阵,它的每一行.每一列和对角线之和均相等.例如,三阶魔方阵为      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

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

魔方阵是一个古老的智力问题,它要求在一个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]

奇数魔方

魔方阵,古代又称“纵横图”,是指组成元素为自然数1.2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. 8 1 6 3 5 7 4 9 2 魔方阵的排列规律如下: ⑴将1放在第一行中间一列:⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列):⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行):例如1在第一行,则2应放在最下一行,列数同样加1:⑷

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: