列印螺旋矩陣(遞迴解法)

2021-06-18 12:36:22 字數 3393 閱讀 4167

求職過程遇到的一道面試題,當時沒有做出來,回來想出幾種方法,其中大多是「蠻力」解法,不得不陷入一堆的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)

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() }

執行結果, 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

修改**:

#include "stdio.h"

#include /*void setmatrix(int **matrix, int x, int y, int start, int n)

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 setmatrix(int **a,int d, int n,int i)

for(int j=0+d;j0+d;l--)

a[n-1-d][l]=i++;

for(int m=n-1-d;m>=1+d;m--)

a[m][0+d]=i++;

setmatrix(a,d+1,n,i);

}void main()

}

列印螺旋矩陣(遞迴解法)

求職過程遇到的一道面試題,當時沒有做出來,回來想出幾種方法,其中大多是 蠻力 解法,不得不陷入一堆的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 ...

螺旋矩陣 解法

void fun1 else if up right else int sum 0 將現在數值的外面每一層的數值都加起來 if n 2 0 for int k 0 k max level level k sum 8 max level k 4 else for int k 0 k max level...

列印螺旋矩陣

首先,看一下螺旋矩陣的樣子.如下圖 求螺旋陣列的 如下 dev cpp平台 include using namespace std int alloc mat int round 動態二維陣列的分配 void del mat int mat,int round 刪除動態分配的二維陣列 void pr...