📜  在M范围内应用增量运算后打印矩阵

📅  最后修改于: 2021-04-21 23:42:29             🧑  作者: Mango

给定大小为N * N的二维矩阵mat [] [] ,矩阵的所有元素最初均为0 。需要在矩阵上执行多个查询(M个范围),其中每个查询由四个整数X1Y1X2Y2组成,任务是向mat [X1] [Y1]mat之间的所有像元加1 [X2] [Y2] (包括两者)并最后打印更新后的矩阵的内容。

例子:

方法:对于每个查询, (X1,Y1)代表子矩阵的左上角单元格,而(X2,Y2)代表子矩阵的右下角单元格。对于每个左上小区添加1顶端左元素,并从下一个到右下单元中的元件(如果有的话)中减去1。
然后维护原始(现在已修改)矩阵中所有元素的运行总和,并且每次添加时,当前总和就是当前位置处的元素(已更新)。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include
using namespace std;
  
// Function to update and print the 
// matrix after performing queries
void updateMatrix(int n, int q[3][4])
{
    int i, j;
    int mat[n][n];
    for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
    mat[i][j] = 0;
    for (i = 0; i < 3; i++)
    {
        int X1 = q[i][0];
        int Y1 = q[i][1];
        int X2 = q[i][2];
        int Y2 = q[i][3];
  
        // Add 1 to the first element of 
        // the sub-matrix
        mat[X1][Y1]++;
  
        // If there is an element after the 
        // last element of the sub-matrix 
        // then decrement it by 1
        if (Y2 + 1 < n)
            mat[X2][Y2 + 1]--;
        else if (X2 + 1 < n)
            mat[X2 + 1][0]--;
    }
  
    // Calculate the running sum
    int sum = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++) 
        {
            sum += mat[i][j];
  
            // Print the updated element
            cout << sum << " ";
        }
  
        // Next line
        cout << endl;
    }
}
  
// Driver code
int main()
{
  
    // Size of the matrix
    int n = 5;
      
  
    // Queries
    int q[3][4] = {{ 0, 0, 1, 2 },
                   { 1, 2, 3, 4 },
                   { 1, 4, 3, 4 }};
  
    updateMatrix(n, q);
    return 0;
}
  
// This code is contributed by chandan_jnu


Java
// Java implementation of the approach
public class GFG {
  
    // Function to update and print the matrix
    // after performing queries
    static void updateMatrix(int n, int q[][], int mat[][])
    {
        int i, j;
        for (i = 0; i < q.length; i++) {
            int X1 = q[i][0];
            int Y1 = q[i][1];
            int X2 = q[i][2];
            int Y2 = q[i][3];
  
            // Add 1 to the first element of the sub-matrix
            mat[X1][Y1]++;
  
            // If there is an element after the last element
            // of the sub-matrix then decrement it by 1
            if (Y2 + 1 < n)
                mat[X2][Y2 + 1]--;
            else if (X2 + 1 < n)
                mat[X2 + 1][0]--;
        }
  
        // Calculate the running sum
        int sum = 0;
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                sum += mat[i][j];
  
                // Print the updated element
                System.out.print(sum + " ");
            }
  
            // Next line
            System.out.println();
        }
    }
  
    // Driver code
    public static void main(String[] args)
    {
  
        // Size of the matrix
        int n = 5;
        int mat[][] = new int[n][n];
  
        // Queries
        int q[][] = { { 0, 0, 1, 2 },
                      { 1, 2, 3, 4 },
                      { 1, 4, 3, 4 } };
  
        updateMatrix(n, q, mat);
    }
}


C#
// C# implementation of the above approach 
  
using System;
  
public class GFG { 
  
    // Function to update and print the matrix 
    // after performing queries 
    static void updateMatrix(int n, int [,]q, int [,]mat) 
    { 
        int i, j; 
        for (i = 0; i < q.GetLength(0); i++) { 
            int X1 = q[i,0]; 
            int Y1 = q[i,1]; 
            int X2 = q[i,2]; 
            int Y2 = q[i,3]; 
  
            // Add 1 to the first element of the sub-matrix 
            mat[X1,Y1]++; 
  
            // If there is an element after the last element 
            // of the sub-matrix then decrement it by 1 
            if (Y2 + 1 < n) 
                mat[X2,Y2 + 1]--; 
            else if (X2 + 1 < n) 
                mat[X2 + 1,0]--; 
        } 
  
        // Calculate the running sum 
        int sum = 0; 
        for (i = 0; i < n; i++) { 
            for (j = 0; j < n; j++) { 
                sum += mat[i,j]; 
  
                // Print the updated element 
                Console.Write(sum + " "); 
            } 
  
            // Next line 
            Console.WriteLine(); 
        } 
    } 
  
    // Driver code 
    public static void Main() 
    { 
  
        // Size of the matrix 
        int n = 5; 
        int [,]mat = new int[n,n]; 
  
        // Queries 
        int [,]q = { { 0, 0, 1, 2 }, 
                    { 1, 2, 3, 4 }, 
                    { 1, 4, 3, 4 } }; 
  
        updateMatrix(n, q, mat); 
    } 
    // This code is contributed by Ryuga
}


Python3
# Python 3 implementation of the approach
  
# Function to update and print the matrix
# after performing queries
def updateMatrix(n, q, mat):
          
    for i in range(0, len(q)):
            X1 = q[i][0];
            Y1 = q[i][1];
            X2 = q[i][2];
            Y2 = q[i][3];
  
            # Add 1 to the first element of
            # the sub-matrix
            mat[X1][Y1] = mat[X1][Y1] + 1;
  
            # If there is an element after the 
            # last element of the sub-matrix
            # then decrement it by 1
            if (Y2 + 1 < n):
                mat[X2][Y2 + 1] = mat[X2][Y2 + 1] - 1;
            elif (X2 + 1 < n):
                mat[X2 + 1][0] = mat[X2 + 1][0] - 1;
  
    # Calculate the running sum
    sum = 0;
    for i in range(0, n):
        for j in range(0, n): 
            sum =sum + mat[i][j];
  
            # Print the updated element
            print(sum, end = ' ');
              
        # Next line
        print(" ");
          
# Driver code
  
# Size of the matrix
n = 5;
mat = [[0 for i in range(n)] 
          for i in range(n)];
  
# Queries
q = [[ 0, 0, 1, 2 ],
     [ 1, 2, 3, 4 ],
     [ 1, 4, 3, 4 ]];
  
updateMatrix(n, q, mat);
      
# This code is contributed 
# by Shivi_Aggarwal


PHP


输出:
1 1 1 1 1 
1 1 2 1 2 
2 2 2 2 2 
2 2 2 2 2 
0 0 0 0 0