📜  将给定矩阵转换为排序的螺旋矩阵

📅  最后修改于: 2021-04-27 22:02:03             🧑  作者: Mango

给定矩阵,任务是将给定矩阵转换为排序的螺旋矩阵。

例子:

Input: y[][] = {
          { 2, 5, 12 },
          { 22, 54, 55 },
          { 1, 6, 8 }
        };
Output:
       1 2 5 
       45 55 6
       22 12 8

Input: y[][] = {
          { 2, 5, 12 },
          { 22, 45, 55 },
          { 1, 6, 8 },
          { 13, 56, 10 }
        };
Output:
       1 2 5 
       45 55 6 
       22 56 8 
       13 12 10

方法:

  • 将给定的2D数组转换为1D数组。
  • 排序一维数组
  • 将一维转换为螺旋矩阵
  • 这可以通过4个存储所有元素的循环来解决。每个for循环都与矩阵一起定义单个方向的移动。第一个for循环代表从左到右的运动,而第二个爬行代表从上到下的运动,第三个代表从右到左的运动,第四个代表从下到上的运动。

下面是上述方法的实现:

C++
// C++ program to Convert given Matrix
// into sorted Spiral Matrix
#include 
using namespace std;
  
const int MAX = 1000;
  
// Function to convert the array to Spiral
void ToSpiral(int m, int n,
            int Sorted[], int a[MAX][MAX])
{
    // For Array pointer
    int index = 0;
  
    // 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] = Sorted[index];
            index++;
        }
  
        k++;
  
        // Print the last column
        // from the remaining columns
        for (int i = k; i < m; ++i)
        {
            a[i][n - 1] = Sorted[index];
            index++;
        }
        n--;
  
        // Print the last row
        // from the remaining rows
        if (k < m) 
        {
            for (int i = n - 1; i >= l; --i)
            {
                a[m - 1][i] = Sorted[index];
                index++;
            }
            m--;
        }
  
        // Print the first column
        // from the remaining columns
        if (l < n)
        {
            for (int i = m - 1; i >= k; --i)
            {
                a[i][l] = Sorted[index];
                index++;
            }
            l++;
        }
    }
}
  
// Function to convert 2D array to 1D array
void convert2Dto1D(int y[MAX][MAX], 
                   int m, int n,int x[])
{
  
    int index = 0;
  
    // Store value 2D Matrix To 1D array
    for (int i = 0; i < m; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            x[index] = y[i][j];
            index++;
        }
    }
}
  
// Function to print the Matrix
void PrintMatrix(int a[MAX][MAX], 
                int m, int n)
{
  
    // Print Spiral Matrix
    for (int i = 0; i < m; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
}
  
  
// Function to Convert given Matrix
// into sorted Spiral Matrix
void convertMatrixToSortedSpiral(
    int y[MAX][MAX], int m, int n)
{
    int a[MAX][MAX] = {0};
    int x[m * n];
  
    convert2Dto1D(y, m, n,x);
    sort(x, x + n * m);
    ToSpiral(m, n, x, a);
    PrintMatrix(a, m, n);
}
  
// Driver code
int main()
{
    int m = 4, n = 3;
    int y[MAX][MAX] = {
        { 2, 5, 12 },
        { 22, 45, 55 },
        { 1, 6, 8 },
        { 13, 56, 10 }};
  
    convertMatrixToSortedSpiral(y, m, n);
  
    return 0;
}
  
// This code is contributed by Arnab Kundu


Java
// Java program to Convert given Matrix
// into sorted Spiral Matrix
  
import java.util.*;
  
public class TwistedMatrix {
  
    static int MAX = 1000;
  
    // Function to convert the array to Spiral
    static void ToSpiral(int m, int n,
                         int Sorted[], int a[][])
    {
        // For Array pointer
        int index = 0;
  
        // 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] = Sorted[index];
                index++;
            }
  
            k++;
  
            // Print the last column
            // from the remaining columns
            for (int i = k; i < m; ++i) {
                a[i][n - 1] = Sorted[index];
                index++;
            }
            n--;
  
            // Print the last row
            // from the remaining rows
            if (k < m) {
                for (int i = n - 1; i >= l; --i) {
                    a[m - 1][i] = Sorted[index];
                    index++;
                }
                m--;
            }
  
            // Print the first column
            // from the remaining columns
            if (l < n) {
                for (int i = m - 1; i >= k; --i) {
                    a[i][l] = Sorted[index];
                    index++;
                }
                l++;
            }
        }
    }
  
    // Function to convert 2D array to 1D array
    public static int[] convert2Dto1D(
        int y[][], int m, int n)
    {
  
        int index = 0;
        int x[] = new int[m * n];
  
        // Store value 2D Matrix To 1D array
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                x[index] = y[i][j];
                index++;
            }
        }
        return x;
    }
  
    // Function to print the Matrix
    public static void PrintMatrix(
        int a[][], int m, int n)
    {
  
        // Print Spiral Matrix
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }
    }
  
    // Function to sort the array
    public static int[] SortArray(int x[])
    {
  
        // Sort array Using InBuilt Function
        Arrays.sort(x);
  
        return x;
    }
  
    // Function to Convert given Matrix
    // into sorted Spiral Matrix
    public static void convertMatrixToSortedSpiral(
        int y[][], int m, int n)
    {
  
        int a[][] = new int[MAX][MAX];
        int x[] = new int[m * n];
  
        x = convert2Dto1D(y, m, n);
        x = SortArray(x);
        ToSpiral(m, n, x, a);
        PrintMatrix(a, m, n);
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int m = 4, n = 3;
        int y[][] = {
            { 2, 5, 12 },
            { 22, 45, 55 },
            { 1, 6, 8 },
            { 13, 56, 10 }
        };
  
        convertMatrixToSortedSpiral(y, m, n);
    }
}
  
// This article is contributed by VRUND R PATEL


Python 3
# Python3 program to Convert given Matrix
# into sorted Spiral Matrix
MAX = 1000
  
# Function to convert the array to Spiral
def ToSpiral(m, n, Sorted, a):
      
    # For Array pointer
    index = 0
  
    # k - starting row index
    # m - ending row index
    # l - starting column index
    # n - ending column index
    k = 0
    l = 0
  
    while (k < m and l < n):
          
        # Print the first row
        # from the remaining rows
        for i in range(l, n, 1):
            a[k][i] = Sorted[index]
            index += 1
  
        k += 1
  
        # Print the last column
        # from the remaining columns
        for i in range(k, m, 1):
            a[i][n - 1] = Sorted[index]
            index += 1
          
        n -= 1
  
        # Print the last row
        # from the remaining rows
        if (k < m):
            i = n - 1
            while(i >= l):
                a[m - 1][i] = Sorted[index]
                index += 1
                i -= 1
  
            m -= 1
  
        # Print the first column
        # from the remaining columns
        if (l < n):
            i = m - 1
            while(i >= k):
                a[i][l] = Sorted[index]
                index += 1
                i -= 1
              
            l += 1
  
# Function to convert 2D array to 1D array
def convert2Dto1D(y, m, n):
    index = 0
    x = [0 for i in range(m * n)]
  
    # Store value 2D Matrix To 1D array
    for i in range(m):
        for j in range(n):
            x[index] = y[i][j]
            index += 1
          
    return x
  
# Function to print the Matrix
def PrintMatrix(a, m, n):
      
    # Print Spiral Matrix
    for i in range(m):
        for j in range(n):
            print(a[i][j], end =" ")
          
        print('\n', end = "")
  
# Function to sort the array
def SortArray(x):
      
    # Sort array Using InBuilt Function
    x.sort(reverse = False)
  
    return x
  
# Function to Convert given Matrix
# into sorted Spiral Matrix
def convertMatrixToSortedSpiral(y, m, n):
    a = [[0 for i in range(MAX)] 
            for j in range(MAX)]
    x = [0 for i in range(15)]
  
    x = convert2Dto1D(y, m, n)
    x = SortArray(x)
    ToSpiral(m, n, x, a)
    PrintMatrix(a, m, n)
  
# Driver code
if __name__ == '__main__':
    m = 4
    n = 3
    y = [[2, 5, 12], [22, 45, 55],
         [1, 6, 8], [13, 56, 10]]
  
    convertMatrixToSortedSpiral(y, m, n)
  
# This code is contributed by Surendra_Gangwar


C#
// C# program to Convert given Matrix
// into sorted Spiral Matrix
using System;
  
class GFG 
{
    static int MAX = 1000;
  
    // Function to convert the array to Spiral
    static void ToSpiral(int m, int n,
                         int []Sorted, int [,]a)
    {
        // For Array pointer
        int index = 0;
  
        // 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] = Sorted[index];
                index++;
            }
  
            k++;
  
            // Print the last column
            // from the remaining columns
            for (int i = k; i < m; ++i)
            {
                a[i, n - 1] = Sorted[index];
                index++;
            }
            n--;
  
            // Print the last row
            // from the remaining rows
            if (k < m) 
            {
                for (int i = n - 1; i >= l; --i) 
                {
                    a[m - 1, i] = Sorted[index];
                    index++;
                }
                m--;
            }
  
            // Print the first column
            // from the remaining columns
            if (l < n) 
            {
                for (int i = m - 1; i >= k; --i) 
                {
                    a[i, l] = Sorted[index];
                    index++;
                }
                l++;
            }
        }
    }
  
    // Function to convert 2D array to 1D array
    public static int[] convert2Dto1D(int [,]y,
                                      int m, int n)
    {
        int index = 0;
        int []x = new int[m * n];
  
        // Store value 2D Matrix To 1D array
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++) 
            {
                x[index] = y[i, j];
                index++;
            }
        }
        return x;
    }
  
    // Function to print the Matrix
    public static void PrintMatrix(int [,]a, 
                                   int m, int n)
    {
  
        // Print Spiral Matrix
        for (int i = 0; i < m; i++) 
        {
            for (int j = 0; j < n; j++)
            {
                Console.Write(a[i, j] + " ");
            }
            Console.WriteLine();
        }
    }
  
    // Function to sort the array
    public static int[] SortArray(int []x)
    {
  
        // Sort array Using InBuilt Function
        Array.Sort(x);
  
        return x;
    }
  
    // Function to Convert given Matrix
    // into sorted Spiral Matrix
    public static void convertMatrixToSortedSpiral(int [,]y, 
                                                   int m, int n)
    {
        int [,]a = new int[MAX, MAX];
        int []x = new int[m * n];
  
        x = convert2Dto1D(y, m, n);
        x = SortArray(x);
        ToSpiral(m, n, x, a);
        PrintMatrix(a, m, n);
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        int m = 4, n = 3;
        int [,]y = {{ 2, 5, 12 },
                    { 22, 45, 55 },
                    { 1, 6, 8 },
                    { 13, 56, 10 }};
  
        convertMatrixToSortedSpiral(y, m, n);
    }
}
  
// This code is contributed by Rajput-Ji


输出:
1 2 5 
45 55 6 
22 56 8 
13 12 10