循环矩阵(以螺旋方式构造数字 1 到m * n
的矩阵)
原文: 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
这个想法是基于以螺旋形式打印给定的矩阵。 我们创建一个大小为m * n
的矩阵,并以螺旋方式遍历它。 在遍历时,我们跟踪变量val
以填充下一个值,我们将val
一个接一个地递增,并将其值放入矩阵中。
C++
// 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 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
# 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#
// 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 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)
。
版权属于:月萌API www.moonapi.com,转载请注明出处