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

原文: https://www.geeksforgeeks.org/circular-matrix-construct-a-matrix-with-numbers-1-to-mn-in-spiral-way/

给定两个值mn,以自然(从 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)