以螺旋形式打印给定的矩阵

原文: 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.

方法 1:这是解决以下问题的简单方法。

  • 方法:可以通过将矩阵划分为回路,正方形或边界来解决该问题。 可以看出,首先以顺时针方式打印外循环的元素,然后再打印内循环的元素。 因此,可以使用打印所有元素的四个循环来解决打印循环元素的问题。 每个for循环都定义了矩阵的单个方向移动。 第一个for循环代表从左到右的运动,而第二个爬取代表从上到下的运动,第三个代表从右到左的运动,第四个代表从下到上的运动。

  • 算法

    1. 创建和初始化变量k起始行索引,m结束行索引,l起始列索引,n结束列索引。

    2. 运行循环,直到打印出所有循环平方。

    3. 在每个外循环中,以顺时针方式打印正方形的元素。

    4. 打印第一行,即打印第k行从列索引ln的元素,并增加k的计数。

    5. 打印右列,即从行索引km打印最后一列或第n-1列并减少n的计数。

    6. 打印底部一行,即如果k > m,则从列n-1l打印第m-1行的元素,并减少m的计数。

    7. 打印左列,即如果l < n,则将第m-1行的第l列的元素打印到k,并增加l的计数。

  • 实现

    C++

    ```

    include

    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

    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行从列索引ln的元素,并增加k的计数。

    4. 打印右列,即从行索引km打印最后一列或第n-1列并减少n的计数。

    5. 打印底部一行,即如果k > m,则从列n-1l打印第m-1行的元素,并减少m的计数。

    6. 打印左列,即如果l < n,则将第m-1行的第l列的元素打印到k,并增加l的计数。

    7. 用行和列的开始和结束索引的值递归调用函数。

  • 实现

    C++

    ```

    include

    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)

      不需要多余的空间。

  • 矩阵的对角遍历

  • 以反螺旋形式打印矩阵

  • 以 Z 字形打印给定矩阵

如果您发现上述代码不正确,或者找到其他解决相同问题的方法,请写评论。