一:奇魔方阵

算法:

  1. 1.第一个元素放在第一行中间一列
  1. .下一个元素存放在当前元素的上一行、下一列。
  1. .如果上一行、下一列已经有内容,则下一个元素的存放位置为当前列的下一行。
  1. 在找上一行、下一行或者下一列的时候,必须把这个矩阵看成是回绕的。

算法实现:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define MAXSIZE 100
  7.  
  8. int main()
  9. {
  10. //输出魔方阵
  11. int n,i,j;
  12. int row, col;
  13. int lrow, lcol; //保存上一步数据,用于还原
  14. int a[MAXSIZE][MAXSIZE] = { };
  15.  
  16. while ()
  17. {
  18. printf("print a odd number:(3-99)");
  19. scanf("%d", &n);
  20. if (n % )
  21. break;
  22. }
  23.  
  24. row = ;
  25. col = (n - 1) / 2;
  26. a[row][col] = ;
  27.  
  28. for (i = ; i <= n*n; i++)
  29. {
  30. row--;
  31. col++;
  32. if (row < )
  33. row = n - ;
  34. if (col >= n)
  35. col = ;
  36. if (a[row][col]) //若是上一行下一列处有数据了,我们就要将下标还原,行数加一
  37. {
  38. row = lrow + ;
  39. col = lcol;
  40. if (row >= n)
  41. row = ;
  42. }
  43.  
  44. lcol = col;
  45. lrow = row;
  46. a[row][col] = i;
  47. }
  48.  
  49. for (i = ; i < n; i++)
  50. {
  51. for (j = ; j < n; j++)
  52. printf("%5d", a[i][j]);
  53. printf("\n");
  54. }
  55.  
  56. system("pause");
  57. return ;
  58. }

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

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

算法实现:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define MAXSIZE 100
  7.  
  8. int main()
  9. {
  10. //输出魔方阵
  11. int n,i,j;
  12. int row, col;
  13. int a[MAXSIZE][MAXSIZE] = { };
  14. int tempArray[MAXSIZE*MAXSIZE / 2] = { }; //用于存放各个子方阵的主对角线
  15.  
  16. while ()
  17. {
  18. printf("print a even number:(4-100)");
  19. scanf("%d", &n);
  20. if (n % ==)
  21. break;
  22. }
  23.  
  24. //步骤一:将数据按顺序填充
  25. i = ;
  26. for (row = ; row < n; row++)
  27. for (col = ; col < n; col++)
  28. a[row][col] = i++;
  29.  
  30. //步骤二:将数据全部分为4X4子方阵,取出其中的主对角线,按照大小排序。注意:这里获取的数据已经是从小到大了
  31. i = ;
  32. for (row = ; row < n; row++)
  33. {
  34. for (col = ; col < n; col++)
  35. {
  36. if ((col % == row % ) || ((col % + row % ) == ))
  37. {
  38. tempArray[i] = a[row][col];
  39. i++;
  40. }
  41. }
  42. }
  43.  
  44. //步骤三:将数据从大到小放入之前的子方阵对角线上
  45. i--;
  46. for (row = ; row < n; row++)
  47. {
  48. for (col = ; col < n; col++)
  49. {
  50. if ((col % == row % ) || ((col % + row % ) == ))
  51. {
  52. a[row][col] = tempArray[i];
  53. i--;
  54. }
  55. }
  56. }
  57.  
  58. //步骤四:输出魔方阵
  59. for (i = ; i < n; i++)
  60. {
  61. for (j = ; j < n; j++)
  62. printf("%5d", a[i][j]);
  63. printf("\n");
  64. }
  65.  
  66. system("pause");
  67. return ;
  68. }

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

  1. 将魔方分成ABCD四个k阶方阵,这四个方阵都为奇方阵,利用上面讲到的方法依次将ADBC填充为奇魔方。
  2. 交换AC魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素;对其他行,交换从左向右m列各对应元素。
  3. 交换BD魔方元素,交换从中间列向左m 1列各对应元素。
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define MAXSIZE 6
  7.  
  8. int main()
  9. {
  10. //输出魔方阵
  11. int n, i, j, k,temp;
  12. int row, col;
  13. int lrow, lcol;
  14. int a[MAXSIZE][MAXSIZE] = { };
  15.  
  16. while ()
  17. {
  18. printf("print a even number:4*m+2<m=1,2,...>");
  19. scanf("%d", &n);
  20. if (n % == )
  21. break;
  22. }
  23.  
  24. //步骤一:构建四个子方阵ADBC
  25. //先构建A,然后对A进行每个元素加即可得到所有的子方阵
  26. k = n / ;
  27. row = ;
  28. col = (k - ) / ;
  29. a[row][col] = ;
  30. for (i = ; i <= k*k;i++)
  31. {
  32. row--;
  33. col++;
  34. if (row < )
  35. row = k - ;
  36. if (col >= k)
  37. col = ;
  38. if (a[row][col])
  39. {
  40. row = lrow + ;
  41. col = lcol;
  42. if (row >= k)
  43. row = ;
  44. }
  45.  
  46. lcol = col;
  47. lrow = row;
  48. a[row][col] = i;
  49. }
  50.  
  51. //按照顺序构建DBC方阵
  52. for (row = ; row < k;row++)
  53. {
  54. for (col = ; col < k;col++)
  55. {
  56. a[row + k][col + k] = a[row][col] + k*k; //D子方阵
  57. a[row][col + k] = a[row][col] + *k*k; //B子方阵
  58. a[row + k][col] = a[row][col] + *k*k; //C子方阵
  59. }
  60. }
  61.  
  62. //步骤二:交换AC子方阵的数据
  63. //1.先交换中间行的右半部分的m列,N=2*(2*m+1),k=2*m+1,m=(k-1)/2,所以这里的m是不包含最后一列的,包含中间列
  64. //2.对于其他行,将会每行的前半部分
  65. for (row = ; row < k;row++)
  66. {
  67. if (row == k / ) //中间行
  68. {
  69. for (col = k / ; col < k - ; col++)
  70. {
  71. temp = a[row][col];
  72. a[row][col] = a[row + k][col];
  73. a[row + k][col] = temp;
  74. }
  75. }
  76. else //其他行,交换前m列,不包含中间列
  77. {
  78. for (col = ; col < k / ;col++)
  79. {
  80. temp = a[row][col];
  81. a[row][col] = a[row + k][col];
  82. a[row + k][col] = temp;
  83. }
  84. }
  85. }
  86.  
  87. //步骤三:交换BD子方阵,交换中间列向左m-1列
  88. for (row = ; row < k;row++)
  89. {
  90. for (i = ; i < (k - ) / - ; i++)
  91. {
  92. temp = a[row][k + k / - i];
  93. a[row][k + k / - i] = a[row + k][k + k / - i];
  94. a[row + k][k + k / - i] = temp;
  95. }
  96. }
  97.  
  98. //步骤四:输出魔方阵
  99. for (i = ; i < n; i++)
  100. {
  101. for (j = ; j < n; j++)
  102. printf("%5d", a[i][j]);
  103. printf("\n");
  104. }
  105.  
  106. system("pause");
  107. return ;
  108. }

C语言复习---输出魔方阵的更多相关文章

  1. C语言---魔方阵

    魔方阵的定义:在n*n的方阵中,每一行的和=每一列的和=对角线的和.(本文中涉及的n为大于3的奇数). 例如3*3的魔方阵为: 5*5的魔方阵为: 如何写魔方阵呢? 1.数字1位于第一行的正中间2.下 ...

  2. 基于visual Studio2013解决C语言竞赛题之0523魔方阵

     题目

  3. SDUST 作业10 Problem D 魔方阵

    Description 所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等.如三阶魔方阵: 8 1 6 3 5 7 4 9 2     魔方阵的规律如下: ...

  4. Project 3:N级魔方阵

    魔方阵:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵.而这个相等的和称为魔术数字.若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵. 目标:输入一 ...

  5. C语言复习---零散补充

    一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...

  6. C语言复习20170728

    C语言复习20170728 键盘输入和屏幕输出 字符常量:把字符放在一对单引号内,适用于多数可打印字符. 转义字符: 以反斜线()开头,也是放在一对单引号内,适用于控制字符. .\t,是水平制表符,相 ...

  7. C语言复习-字符串与指针

    C语言复习-字符串与指针 例一: [字符串处理 去除C代码中的注释] C/C++代码中有两种注释,/* */和//.编译器编译预处理时会先移除注释.就是把/*和*/之间的部分去掉,把//以及之后的部分 ...

  8. C语言复习系列-转义字符

    C语言复习系列-转义字符 准备学习stm32单片机,感觉需要复习一下C语言,翻看了菜鸟教程,竟然有不少地方看不懂,真让人汗颜······ 转义字符大部分语言里面都有,至少我学过的里面都有,在这些语言中 ...

  9. Python旋转魔方阵

    [问题描述]输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素. N=3时:    1    2    3    8   ...

随机推荐

  1. BZOJ2463[中山市选2009]谁能赢呢?——博弈论

    题目描述 小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问 ...

  2. python中的split()方法的使用

    Python split()方法:通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格.换行(\n).制表符(\t)等. l  Str.split()默认以空格,换行\n,制 ...

  3. Hdoj 1176.免费馅饼 题解

    Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...

  4. 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析

    @20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析

  5. ssh 免密root登录

    安装SSH SERVER 在所有的节点上都安装SSH server服务. # apt-get install openssh-server1 因为我们搭建的Ceph直接使用root用户,所以需要修改s ...

  6. 常用CSS样式速查

    writing-mode: vertical-lr; -webkit-writing-mode: vertical-lr; -ms-writing-mode: vertical-lr; 作用 CSS ...

  7. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

  8. redis 从入门到遗忘

    Key操作 keys * *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符 exists key 存在返回1,不存在返回0 type key rename oldkey ne ...

  9. LVS+Keepalived搭建高可用负载均衡

    应用环境: LVS负责多台WEB端的负载均衡(LB):Keepalived负责LVS的高可用(HA),这里介绍主备模型. 测试环境: 配置步骤: 1. 安装软件 在LVS-1和LVS-2两台主机上安装 ...

  10. Typescript学习笔记(二)枚举

    跟随handbook的脚步,详细介绍一下枚举. enum Direction { Up = 1, Down, Left, Right } 一个枚举类型可以包含零个或多个枚举成员,每个枚举成员可以是一个 ...