多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 以螺旋形式打印给定的矩阵 > 原文: [https://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/](https://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/) 给定 2D 数组,以螺旋形式打印。 请参阅以下示例。 **示例**: ``` Input: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Output: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 Explanation: The output is matrix in spiral format. Input: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Output: 1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 Explanation :The output is matrix in spiral format. ``` ![](https://img.kancloud.cn/8c/0b/8c0b33fca2eec6ae74ede2fa1df7955d_778x553.png) **方法 1 **:这是解决以下问题的简单方法。 * **方法**:可以通过将矩阵划分为回路,正方形或边界来解决该问题。 可以看出,首先以顺时针方式打印外循环的元素,然后再打印内循环的元素。 因此,可以使用打印所有元素的四个循环来解决打印循环元素的问题。 每个“ for”循环都定义了矩阵的单个方向移动。 第一个 for 循环代表从左到右的运动,而第二个爬取代表从上到下的运动,第三个代表从右到左的运动,第四个代表从下到上的运动。 * **算法**: 1. 创建和初始化变量 k –起始行索引,m –结束行索引,l –起始列索引,n –结束列索引 2. 运行循环,直到打印出所有循环平方。 3. 在每个外循环中,以顺时针方式打印正方形的元素。 4. 打印第一行,即打印第 k 行从列索引 l 到 n 的元素,并增加 k 的计数。 5. 打印右列,即从行索引 k 到 m 打印最后一列或第 n-1 列并减少 n 的计数。 6. 打印底部一行,即如果 k > m,则从列 n-1 到 l 打印第 m-1 行的元素,并减少 m 的计数 7. 打印左列,即如果 l < n,则将第 m-1 行的第 l 列的元素打印到 k,并增加 l 的计数。 * **实现**: ## C++ ``` #include <bits/stdc++.h> using namespace std; #define R 3 #define C 6 void spiralPrint(int m, int n, int a[R][C]) {     int i, k = 0, l = 0;     /* k - starting row index          m - ending row index          l - starting column index          n - ending column index          i - iterator      */     while (k < m && l < n) {         /* Print the first row from                the remaining rows */         for (i = l; i < n; ++i) {             cout << a[k][i] << " ";         }         k++;         /* Print the last column           from the remaining columns */         for (i = k; i < m; ++i) {             cout << a[i][n - 1] << " ";         }         n--;         /* Print the last row from                  the remaining rows */         if (k < m) {             for (i = n - 1; i >= l; --i) {                 cout << a[m - 1][i] << " ";             }             m--;         }         /* Print the first column from                    the remaining columns */         if (l < n) {             for (i = m - 1; i >= k; --i) {                 cout << a[i][l] << " ";             }             l++;         }     } } /* Driver program to test above functions */ int main() {     int a[R][C] = { { 1, 2, 3, 4, 5, 6 },                     { 7, 8, 9, 10, 11, 12 },                     { 13, 14, 15, 16, 17, 18 } };     spiralPrint(R, C, a);     return 0; } // This is code is contributed by rathbhupendra ``` ## C ``` /* This code is adopted from the solution given     @ http:// effprog.blogspot.com/2011/01/ spiral-printing-of-two-dimensional.html */ #include <stdio.h> #define R 3 #define C 6 void spiralPrint(int m, int n, int a[R][C]) {     int i, k = 0, l = 0;     /*  k - starting row index         m - ending row index         l - starting column index         n - ending column index         i - iterator     */     while (k < m && l < n) {         /* Print the first row from the remaining rows */         for (i = l; i < n; ++i) {             printf("%d ", a[k][i]);         }         k++;         /* Print the last column from the remaining columns */         for (i = k; i < m; ++i) {             printf("%d ", a[i][n - 1]);         }         n--;         /* Print the last row from the remaining rows */         if (k < m) {             for (i = n - 1; i >= l; --i) {                 printf("%d ", a[m - 1][i]);             }             m--;         }         /* Print the first column from the remaining columns */         if (l < n) {             for (i = m - 1; i >= k; --i) {                 printf("%d ", a[i][l]);             }             l++;         }     } } /* Driver program to test above functions */ int main() {     int a[R][C] = { { 1, 2, 3, 4, 5, 6 },                     { 7, 8, 9, 10, 11, 12 },                     { 13, 14, 15, 16, 17, 18 } };     spiralPrint(R, C, a);     return 0; } ``` ## Java ``` // Java program to print a given matrix in spiral form import java.io.*; class GFG {     // Function print matrix in spiral form     static void spiralPrint(int m, int n, int a[][])     {         int i, k = 0, l = 0;         /*  k - starting row index         m - ending row index         l - starting column index         n - ending column index         i - iterator         */         while (k < m && l < n) {             // Print the first row from the remaining rows             for (i = l; i < n; ++i) {                 System.out.print(a[k][i] + " ");             }             k++;             // Print the last column from the remaining columns             for (i = k; i < m; ++i) {                 System.out.print(a[i][n - 1] + " ");             }             n--;             // Print the last row from the remaining rows */             if (k < m) {                 for (i = n - 1; i >= l; --i) {                     System.out.print(a[m - 1][i] + " ");                 }                 m--;             }             // Print the first column from the remaining columns */             if (l < n) {                 for (i = m - 1; i >= k; --i) {                     System.out.print(a[i][l] + " ");                 }                 l++;             }         }     }     // driver program     public static void main(String[] args)     {         int R = 3;         int C = 6;         int a[][] = { { 1, 2, 3, 4, 5, 6 },                       { 7, 8, 9, 10, 11, 12 },                       { 13, 14, 15, 16, 17, 18 } };         spiralPrint(R, C, a);     } } // Contributed by Pramod Kumar ``` ## Python3 ``` # Python3 program to print  # given matrix in spiral form def spiralPrint(m, n, a) :     k = 0; l = 0     ''' k - starting row index         m - ending row index         l - starting column index         n - ending column index         i - iterator '''     while (k < m and l < n) :         # Print the first row from         # the remaining rows          for i in range(l, n) :             print(a[k][i], end = " ")         k += 1         # Print the last column from         # the remaining columns          for i in range(k, m) :             print(a[i][n - 1], end = " ")         n -= 1         # Print the last row from         # the remaining rows          if ( k < m) :             for i in range(n - 1, (l - 1), -1) :                 print(a[m - 1][i], end = " ")             m -= 1         # Print the first column from         # the remaining columns          if (l < n) :             for i in range(m - 1, k - 1, -1) :                 print(a[i][l], end = " ")             l += 1 # Driver Code a = [ [1, 2, 3, 4, 5, 6],       [7, 8, 9, 10, 11, 12],       [13, 14, 15, 16, 17, 18] ] R = 3; C = 6 spiralPrint(R, C, a) # This code is contributed by Nikita Tiwari. ``` ## C# ``` // C# program to print a given // matrix in spiral form using System; class GFG {     // Function print matrix in spiral form     static void spiralPrint(int m, int n, int[, ] a)     {         int i, k = 0, l = 0;         /* k - starting row index         m - ending row index         l - starting column index         n - ending column index         i - iterator         */         while (k < m && l < n) {             // Print the first row              // from the remaining rows             for (i = l; i < n; ++i) {                 Console.Write(a[k, i] + " ");             }             k++;             // Print the last column from the             // remaining columns             for (i = k; i < m; ++i) {                 Console.Write(a[i, n - 1] + " ");             }             n--;             // Print the last row from              // the remaining rows              if (k < m) {                 for (i = n - 1; i >= l; --i) {                     Console.Write(a[m - 1, i] + " ");                 }                 m--;             }             // Print the first column from              // the remaining columns             if (l < n) {                 for (i = m - 1; i >= k; --i) {                     Console.Write(a[i, l] + " ");                 }                 l++;             }         }     }     // Driver program     public static void Main()     {         int R = 3;         int C = 6;         int[, ] a = { { 1, 2, 3, 4, 5, 6 },                       { 7, 8, 9, 10, 11, 12 },                       { 13, 14, 15, 16, 17, 18 } };         spiralPrint(R, C, a);     } } // This code is contributed by Sam007 ``` ## PHP ``` <?php  // PHP program to print a given // matrix in spiral form $R = 3; $C = 6; function spiralPrint($m, $n, &$a) {     $k = 0;     $l = 0;     /* $k - starting row index         $m - ending row index         $l - starting column index         $n - ending column index         $i - iterator     */     while ($k < $m && $l < $n)     {         /* Print the first row from            the remaining rows */         for ($i = $l; $i < $n; ++$i)         {             echo $a[$k][$i] . " ";         }         $k++;         /* Print the last column          from the remaining columns */         for ($i = $k; $i < $m; ++$i)         {             echo $a[$i][$n - 1] . " ";         }         $n--;         /* Print the last row from            the remaining rows */         if ($k < $m)         {             for ($i = $n - 1; $i >= $l; --$i)             {                 echo $a[$m - 1][$i] . " ";             }             $m--;         }         /* Print the first column from            the remaining columns */         if ($l < $n)         {             for ($i = $m - 1; $i >= $k; --$i)             {                 echo $a[$i][$l] . " ";             }             $l++;          }          } } // Driver code $a = array(array(1, 2, 3, 4, 5, 6),            array(7, 8, 9, 10, 11, 12),            array(13, 14, 15, 16, 17, 18)); spiralPrint($R, $C, $a); // This code is contributed // by ChitraNayal ?> ``` **输出**: ``` 1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 ``` * **复杂度分析**: * **时间复杂度**: O(m * n)。 要遍历矩阵 O(m * n),需要时间。 * **空间可喜度**:`O(1)`。 不需要多余的空间。 **方法 2** :这是一种递归方法。 * **方法**:上述问题可以通过递归打印矩阵的边界来解决。 在每个递归调用中,我们减小矩阵的维数。 打印边界或循环的想法是相同的。 * **算法**: 1. 创建一个使用矩阵和一些变量*(k –起始行索引,m –结束行索引,l –起始列索引,n –结束列索引)*作为参数的递归函数 2. 检查基本情况(状态索引小于或等于结束索引)并按顺时针方向打印边界元素 3. 打印第一行,即打印第 k 行从列索引 l 到 n 的元素,并增加 k 的计数。 4. 打印右列,即从行索引 k 到 m 打印最后一列或第 n-1 列并减少 n 的计数。 5. 打印底部一行,即如果 k > m,则从列 n-1 到 l 打印第 m-1 行的元素,并减少 m 的计数 6. 打印左列,即如果 l < n,则将第 m-1 行的第 l 列的元素打印到 k,并增加 l 的计数。 7. 用行和列的开始和结束索引的值递归调用函数。 * **实现**: ## C++ ``` #include <iostream> using namespace std; #define R 4 #define C 4 // Function for printing matrix in spiral // form i, j: Start index of matrix, row  // and column respectively m, n: End index // of matrix row and column respectively void print(int arr[R][C], int i,                       int j, int m, int n) {     // If i or j lies outside the matrix     if (i >= m or j >= n)         return;     // Print First Row     for (int p = i; p < n; p++)         cout << arr[i][p] << " ";     // Print Last Column     for (int p = i + 1; p < m; p++)         cout << arr[p][n - 1] << " ";     // Print Last Row, if Last and     // First Row are not same     if ((m - 1) != i)         for (int p = n - 2; p >= j; p--)             cout << arr[m - 1][p] << " ";     // Print First Column,  if Last and     // First Column are not same     if ((n - 1) != j)         for (int p = m - 2; p > i; p--)             cout << arr[p][j] << " ";     print(arr, i + 1, j + 1, m - 1, n - 1); } // Driver Program int main() {     int a[R][C] = { { 1, 2, 3, 4 },                     { 5, 6, 7, 8 },                     { 9, 10, 11, 12 },                     { 13, 14, 15, 16 } };     print(a, 0, 0, R, C);     return 0; } // This Code is contributed by Ankur Goel ``` ## Java ``` // Java Program to test 1/e law  // for Secretary Problem : import java.util.*; class GFG {     static int R = 4;     static int C = 4;     // Function for printing matrix in spiral     // form i, j: Start index of matrix, row      // and column respectively m, n: End index     // of matrix row and column respectively     static void print(int arr[][], int i,                       int j, int m, int n)     {         // If i or j lies outside the matrix         if (i >= m || j >= n)         {             return;         }         // Print First Row         for (int p = i; p < n; p++)         {             System.out.print(arr[i][p] + " ");         }         // Print Last Column         for (int p = i + 1; p < m; p++)          {             System.out.print(arr[p][n - 1] + " ");         }         // Print Last Row, if Last and         // First Row are not same         if ((m - 1) != i)          {             for (int p = n - 2; p >= j; p--)              {                 System.out.print(arr[m - 1][p] + " ");             }         }         // Print First Column, if Last and         // First Column are not same         if ((n - 1) != j)          {             for (int p = m - 2; p > i; p--)              {                 System.out.print(arr[p][j] + " ");             }         }         print(arr, i + 1, j + 1, m - 1, n - 1);     }     // Driver Code     public static void main(String[] args)      {         int a[][] = {{1, 2, 3, 4},                      {5, 6, 7, 8},                      {9, 10, 11, 12},                      {13, 14, 15, 16}};         print(a, 0, 0, R, C);     } } // This code is contributed by 29AjayKumar ``` ## C# ``` // C# Program to test 1/e law  // for Secretary Problem : using System; class GFG {     static int R = 4;     static int C = 4;     // Function for printing matrix in spiral     // form i, j: Start index of matrix, row      // and column respectively m, n: End index     // of matrix row and column respectively     static void print(int [,]arr, int i,                       int j, int m, int n)     {         // If i or j lies outside the matrix         if (i >= m || j >= n)         {             return;         }         // Print First Row         for (int p = i; p < n; p++)         {             Console.Write(arr[i, p] + " ");         }         // Print Last Column         for (int p = i + 1; p < m; p++)          {             Console.Write(arr[p, n - 1] + " ");         }         // Print Last Row, if Last and         // First Row are not same         if ((m - 1) != i)          {             for (int p = n - 2; p >= j; p--)              {                 Console.Write(arr[m - 1, p] + " ");             }         }         // Print First Column, if Last and         // First Column are not same         if ((n - 1) != j)          {             for (int p = m - 2; p > i; p--)              {                 Console.Write(arr[p, j] + " ");             }         }         print(arr, i + 1, j + 1, m - 1, n - 1);     }     // Driver Code     public static void Main(String[] args)      {         int [,]a = {{1, 2, 3, 4},                     {5, 6, 7, 8},                     {9, 10, 11, 12},                     {13, 14, 15, 16}};         print(a, 0, 0, R, C);     } }  // This code is contributed by Princi Singh ``` **输出**: ``` 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 ``` * **复杂度分析**: * **时间复杂度**: O(m * n)。 要遍历矩阵 O(m * n),需要时间。 * **空间可喜度**:`O(1)`。 不需要多余的空间。 * [矩阵](https://www.geeksforgeeks.org/zigzag-or-diagonal-traversal-of-matrix/)的对角遍历 * [抗螺旋形式的打印矩阵](https://www.geeksforgeeks.org/print-matrix-antispiral-form/) * [以 Z 字形打印给定矩阵](https://www.geeksforgeeks.org/print-given-matrix-zigzag-form/) 如果您发现上述代码不正确,或者找到其他解决相同问题的方法,请写评论。