打印螺旋矩阵(递归解法)

02 嵌入式/C/C++ 专栏收录该内容
6 篇文章 0 订阅
 
求职过程遇到的一道面试题,当时没有做出来,回来想出几种方法,其中大多是“蛮力”解法,不得不陷入一堆的 i j 循环之中。最后想出一种递归解法,现记录如下。
题目如下:
输入 N, 打印 N*N 螺旋矩阵
比如 N = 3 ,打印:
1 2 3
8 9 4
7 6 5
 
N = 4 ,打印:
1    2   3   4
12 13 14 5
11 16 15 6
10 9    8   7
 
递归解法如下:
 
+--------------------------> X 轴
| 1    2   3   4
|  12 13 14 5
|  11 16 15 6
|  10 9    8   7
|
Y轴
 
设元素 1 的坐标为 (0,0) ,元素 13 的坐标为( 1 1 ),……,任一元素的坐标为( x,y
以下为完整代码:
// 功能:打印螺旋矩阵
// 参数说明: matrix :螺旋矩阵          (x y) :第一个元素的坐标
//          start :第一个元素的值      n :矩阵的大小
void SetMatrix(int **matrix, int x, int y, int start, int n) {
       int i, j;
       if (n <= 0)
              return;
       if (n == 1) {
              matrix[x][y] = start;
              return;
       }
       for (i = x; i < x + n-1; i++)          /* 上部 */
              matrix[y][i] = start++;
       for (j = y; j < y + n-1; j++)          /* 右边 */
              matrix[j][x+n-1] = start++;
       for (i = x+n-1; i > x; i--)              /* 底部 */
              matrix[y+n-1][i] = start++;
       for (j = y+n-1; j > y; j--)              /* 左边 */
              matrix[j][x] = start++;
       SetMatrix(matrix, x+1, y+1, start, n-2);     /* 递归 */
}
 
void main() {
       int i, j;
       int n;
    int **matrix; // 螺旋矩阵(二维数组)
      
       scanf("%d", &n);
       matrix = (int **)malloc(n * sizeof(int *)); // 为矩阵分配空间
       for (i = 0; i<n; i++)
              matrix[i] = (int *)malloc(n * sizeof(int));
      
SetMatrix(matrix, 0, 0, 1, n);
 
       // 打印螺旋矩阵
       for(i = 0; i < n; i++) {
              for (j = 0; j < n; j++)
                     printf("%4d", matrix[i][j]);
       printf("/n");
       }
}
 
 
 
运行结果, n = 15 时
 
1      2        3       4        5       6        7        8       9        10     11      12     13     14   15
56   57      58     59     60     61      62     63      64     65     66      67     68     69   16
55   104   105   106   107   108   109   110   111   112   113   114   115   70   17
54   103   144   145   146   147   148   149   150   151   152   153   116   71   18
53   102   143   176   177   178   179   180   181   182   183   154   117   72   19
52   101   142   175   200   201   202   203   204   205   184   155   118   73   20
51   100   141   174   199   216   217   218   219   206   185   156   119   74   21
50   99     140   173   198   215   224   225   220   207   186   157   120   75    22
49   98     139   172   197   214   223   222   221   208   187   158   121   76    23
48   97     138   171   196   213   212   211   210   209   188   159   122   77    24
47   96     137   170   195   194   193   192   191   190   189   160   123   78    25
46   95     136   169   168   167   166   165   164   163   162   161   124   79    26
45   94     135   134   133   132   131   130   129   128   127   126   125    80   27
44   93     92     91     90      89     88      87     86      85     84     83      82      81   28
43   42     41     40     39      38     37      36     35      34     33     32      31      30   29
  • 9
    点赞
  • 4
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值