循环矩阵(以螺旋方式构造一个数字为1到m*n的矩阵)

给定两个值m和n,用1到m*n的自然数以螺旋(或圆形)方式(顺时针)填充大小为“m*n”的矩阵。

null

例如:

Input : m = 4, n = 4Output :  1  2  3  4         12 13 14  5         11 16 15  6         10  9  8  7 Input : m = 3, n = 4Output :  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 (n)] for i in range (m)]
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( "" );
}
}
}


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 ( "" );
}
// This code is contributed
// by Shivi_Aggarwal
?>


Javascript

<script>
// Javascript program to fill a matrix with values from
// 1 to n*n in spiral fashion.
const MAX = 100;
// 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
let val = 1;
/*  k - starting row index
m - ending row index
l - starting column index
n - ending column index */
let k = 0, l = 0;
while (k < m && l < n)
{
/* Print the first row from the remaining
rows */
for (let i = l; i < n; ++i)
a[k][i] = val++;
k++;
/* Print the last column from the remaining
columns */
for (let i = k; i < m; ++i)
a[i][n-1] = val++;
n--;
/* Print the last row from the remaining
rows */
if (k < m)
{
for (let i = n - 1; i >= l; --i)
a[m-1][i] = val++;
m--;
}
/* Print the first column from the remaining
columns */
if (l < n)
{
for (let i = m - 1; i >= k; --i)
a[i][l] = val++;
l++;
}
}
}
/* Driver program to test above functions */
let m = 4, n = 4;
let a = Array.from(Array(MAX), () => new Array(MAX));
spiralFill(m, n, a);
for (let i = 0; i < m; i++)
{
for (let j = 0; j < n; j++)
document.write(a[i][j] + " " );
document.write( "<br>" );
}
// This code is contributed by souravmahato348.
</script>


输出:

 1  2  3  412 13 14  511 16 15  610  9  8  7 

时间复杂性: O(m*n)

空间复杂性: O(m*n)

本文由 阿尤什·焦哈里 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享