🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 圆形矩阵(以螺旋方式构造数字 1 到 m * n 的矩阵) > 原文: [https://www.geeksforgeeks.org/circular-matrix-construct-a-matrix-with-numbers-1-to-mn-in-spiral-way/](https://www.geeksforgeeks.org/circular-matrix-construct-a-matrix-with-numbers-1-to-mn-in-spiral-way/) 给定两个值 m 和 n,以自然(从 1 到 m * n)的螺旋(或圆形)方式(顺时针)填充大小为“ m * n”的矩阵。 **示例**: ``` Input : m = 4, n = 4 Output : 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 Input : m = 3, n = 4 Output : 1 2 3 4 10 11 12 5 9 8 7 6 ``` 这个想法是基于[以螺旋形式](https://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/)打印给定的矩阵。 我们创建一个大小为 m * n 的矩阵,并以螺旋方式遍历它。 在遍历时,我们跟踪变量“ val”以填充下一个值,我们将“ val”一个接一个地递增,并将其值放入矩阵中。 ## C++ ```cpp // C++ program to fill a matrix with values from // 1 to n*n in spiral fashion. #include <bits/stdc++.h> using namespace std; const int MAX = 100; // Fills a[m][n] with values from 1 to m*n in // spiral fashion. void spiralFill(int m, int n, int a[][MAX]) {     // Initialize value to be filled in matrix     int val = 1;     /*  k - starting row index         m - ending row index         l - starting column index         n - ending column index */     int k = 0, l = 0;     while (k < m && l < n)     {         /* Print the first row from the remaining           rows */         for (int i = l; i < n; ++i)             a[k][i] = val++;         k++;         /* Print the last column from the remaining           columns */         for (int i = k; i < m; ++i)             a[i][n-1] = val++;         n--;         /* Print the last row from the remaining            rows */         if (k < m)         {             for (int i = n-1; i >= l; --i)                 a[m-1][i] = val++;             m--;         }         /* Print the first column from the remaining            columns */         if (l < n)         {             for (int i = m-1; i >= k; --i)                  a[i][l] = val++;             l++;         }     } } /* Driver program to test above functions */ int main() {     int m = 4, n = 4;     int a[MAX][MAX];     spiralFill(m, n, a);     for (int i=0; i<m; i++)     {        for (int j=0; j<n; j++)           cout << a[i][j] << " ";        cout << endl;     }     return 0; } ``` ## Java ```java // Java program to fill a matrix with values from // 1 to n*n in spiral fashion. class GFG {     static int MAX = 100; // Fills a[m][n] with values from 1 to m*n in // spiral fashion.     static void spiralFill(int m, int n, int a[][]) {         // Initialize value to be filled in matrix         int val = 1;         /*  k - starting row index         m - ending row index         l - starting column index         n - ending column index */         int k = 0, l = 0;         while (k < m && l < n) {             /* Print the first row from the remaining           rows */             for (int i = l; i < n; ++i) {                 a[k][i] = val++;             }             k++;             /* Print the last column from the remaining           columns */             for (int i = k; i < m; ++i) {                 a[i][n - 1] = val++;             }             n--;             /* Print the last row from the remaining            rows */             if (k < m) {                 for (int i = n - 1; i >= l; --i) {                     a[m - 1][i] = val++;                 }                 m--;             }             /* Print the first column from the remaining            columns */             if (l < n) {                 for (int i = m - 1; i >= k; --i) {                     a[i][l] = val++;                 }                 l++;             }         }     }     /* Driver program to test above functions */     public static void main(String[] args) {         int m = 4, n = 4;         int a[][] = new int[MAX][MAX];         spiralFill(m, n, a);         for (int i = 0; i < m; i++) {             for (int j = 0; j < n; j++) {                 System.out.print(a[i][j] + " ");             }             System.out.println("");         }     } } /* This Java code is contributed by PrinciRaj1992*/ ``` ## Python3 ```py # Python program to fill a matrix with  # values from 1 to n*n in spiral fashion. # Fills a[m][n] with values  # from 1 to m*n in spiral fashion. def spiralFill(m, n, a):     # Initialize value to be filled in matrix.     val = 1     # k - starting row index     # m - ending row index     # l - starting column index     # n - ending column index     k, l = 0, 0     while (k < m and l < n):         # Print the first row from the remaining rows.         for i in range(l, n):             a[k][i] = val             val += 1         k += 1         # Print the last column from the remaining columns.         for i in range(k, m):             a[i][n - 1] = val             val += 1         n -= 1         # Print the last row from the remaining rows.         if (k < m):             for i in range(n - 1, l - 1, -1):                 a[m - 1][i] = val                 val += 1             m -= 1         # Print the first column from the remaining columns.         if (l < n):             for i in range(m - 1, k - 1, -1):                 a[i][l] = val                 val += 1             l += 1 # Driver program if __name__ == '__main__':     m, n = 4, 4     a = [[0 for j in range(m)] for i in range(n)]     spiralFill(m, n, a)     for i in range(m):         for j in range(n):             print(a[i][j], end=' ')         print('') # This code is contributed by Parin Shah ``` ## C# ```cs // C# program to fill a matrix with values from // 1 to n*n in spiral fashion. using System; class GFG {     static int MAX = 100; // Fills a[m,n] with values from 1 to m*n in // spiral fashion.     static void spiralFill(int m, int n, int[,] a) {         // Initialize value to be filled in matrix         int val = 1;         /*  k - starting row index         m - ending row index         l - starting column index         n - ending column index */         int k = 0, l = 0;         while (k < m && l < n) {             /* Print the first row from the remaining           rows */             for (int i = l; i < n; ++i) {                 a[k,i] = val++;             }             k++;             /* Print the last column from the remaining           columns */             for (int i = k; i < m; ++i) {                 a[i,n - 1] = val++;             }             n--;             /* Print the last row from the remaining            rows */             if (k < m) {                 for (int i = n - 1; i >= l; --i) {                     a[m - 1,i] = val++;                 }                 m--;             }             /* Print the first column from the remaining            columns */             if (l < n) {                 for (int i = m - 1; i >= k; --i) {                     a[i,l] = val++;                 }                 l++;             }         }     }     /* Driver program to test above functions */     public static void Main() {         int m = 4, n = 4;         int[,] a = new int[MAX,MAX];         spiralFill(m, n, a);         for (int i = 0; i < m; i++) {             for (int j = 0; j < n; j++) {                 Console.Write(a[i,j] + " ");             }             Console.Write("\n");         }     } } ``` ## PHP ```php <?php // PHP program to fill a matrix with values  // from 1 to n*n in spiral fashion. // Fills a[m][n] with values from 1 to  // m*n in spiral fashion. function spiralFill($m, $n, &$a) {     // Initialize value to be filled      // in matrix     $val = 1;     /* k - starting row index        m - ending row index        l - starting column index        n - ending column index */     $k = 0;     $l = 0;     while ($k < $m && $l < $n)     {         /* Print the first row from         the remaining rows */         for ($i = $l; $i < $n; ++$i)             $a[$k][$i] = $val++;         $k++;         /* Print the last column from         the remaining columns */         for ($i = $k; $i < $m; ++$i)             $a[$i][$n - 1] = $val++;         $n--;         /* Print the last row from          the remaining rows */         if ($k < $m)         {             for ($i = $n - 1; $i >= $l; --$i)                 $a[$m - 1][$i] = $val++;             $m--;         }         /* Print the first column from            the remaining columns */         if ($l < $n)         {             for ($i = $m - 1; $i >= $k; --$i)                 $a[$i][$l] = $val++;             $l++;         }     } } // Driver Code $m = 4; $n = 4; spiralFill($m, $n, $a); for ($i = 0; $i < $m; $i++) {     for ($j = 0; $j < $n; $j++)     {         echo ($a[$i][$j]);         echo (" ");     }     echo ("\n"); } // This code is contributed  // by Shivi_Aggarwal ?> ``` **输出**: ``` 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 ``` **时间复杂度**: O(m * n) **空间复杂度**: O(m * n)