以螺旋形式打印给定的矩阵
原文: 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
循环代表从左到右的运动,而第二个爬取代表从上到下的运动,第三个代表从右到左的运动,第四个代表从下到上的运动。 -
算法:
-
创建和初始化变量
k
起始行索引,m
结束行索引,l
起始列索引,n
结束列索引。 -
运行循环,直到打印出所有循环平方。
-
在每个外循环中,以顺时针方式打印正方形的元素。
-
打印第一行,即打印第
k
行从列索引l
到n
的元素,并增加k
的计数。 -
打印右列,即从行索引
k
到m
打印最后一列或第n-1
列并减少n
的计数。 -
打印底部一行,即如果
k > m
,则从列n-1
到l
打印第m-1
行的元素,并减少m
的计数。 -
打印左列,即如果
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:这是一种递归方法。
-
方法:上述问题可以通过递归打印矩阵的边界来解决。 在每个递归调用中,我们减小矩阵的维数。 打印边界或循环的想法是相同的。
-
算法:
-
创建一个使用矩阵和一些变量(
k
起始行索引,m
结束行索引,l
起始列索引,n
结束列索引)作为参数的递归函数。 -
检查基本情况(状态索引小于或等于结束索引)并按顺时针方向打印边界元素。
-
打印第一行,即打印第
k
行从列索引l
到n
的元素,并增加k
的计数。 -
打印右列,即从行索引
k
到m
打印最后一列或第n-1
列并减少n
的计数。 -
打印底部一行,即如果
k > m
,则从列n-1
到l
打印第m-1
行的元素,并减少m
的计数。 -
打印左列,即如果
l < n
,则将第m-1
行的第l
列的元素打印到k
,并增加l
的计数。 -
用行和列的开始和结束索引的值递归调用函数。
-
-
实现:
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)
。不需要多余的空间。
-
-
矩阵的对角遍历
如果您发现上述代码不正确,或者找到其他解决相同问题的方法,请写评论。
版权属于:月萌API www.moonapi.com,转载请注明出处