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("
");
104     }
105 
106     system("pause");
107 }
原文地址:https://www.cnblogs.com/xiaochi/p/8525302.html