给定一个由N个矩形的坐标组成的矩阵A [] [] ,使得{A [i] [0],A [i] [1]}代表矩形的左下坐标,而{A [i] [2],A [i] [3]}代表矩形的右上角坐标,任务是找到所有矩形所覆盖的像元总数。
例子:
Input: N = 2,
A[][] = {{1, 1, 3, 3}, {2, 1, 4, 2}}
Output: 5
Explanation:
First rectangle covers the following 4 cells:
{(1, 1), (1, 2), (2, 2), (2, 1)}, {(1, 2), (1, 3), (2, 3), (2, 2)}, {(2, 1), (2, 2), (3, 2), (3, 1)}, {(2, 2), (2, 3), (3, 3), (3, 2)}
Second rectangle encloses 2 cells:
{(2, 1), (2, 2), (3, 2), (3, 1)}, {(3, 1), (3, 2), (4, 2), (4, 1)}
Hence, both the rectangles cover 5 cells (since, 1 cell overlaps)
Input: N = 3,
A[][] = {{1, 3, 4, 5}, {3, 1, 7, 4}, {5, 3, 8, 6}}
Output: 24
方法:
请按照以下步骤解决问题:
- 创建一个布尔矩阵arr [MAX] [MAX] ,其中arr [i] [j] = 1 if(i,j)被任何给定矩形包围。否则,arr [i] [j] = 0。
- 对于每个矩形,从左下角到右上角进行迭代,对于所有(i,j)框,将其标记为arr [i] [j] = 1。
- 最后,我们将维护一个可变区域来存储封闭的单元格数量。如果arr [i] [j] == 1则增加面积。
- 打印area的最终值。
下面是上述方法的实现:
C++
// C++ program to find the
// number of cells enclosed
// by the given rectangles
#include
using namespace std;
#define MAX 1001
bool arr[MAX][MAX];
// Update the coordinates lying
// within the rectangle
void updateArray(int x1, int y1,
int x2, int y2)
{
for (int i = x1; i < x2; i++) {
for (int j = y1; j < y2; j++) {
// Update arr[i][j] for
// all (i, j) lying within
// the rectangle
arr[i][j] = true;
}
}
}
// Function to return the total
// area covered by rectangles
int findAreaCovered()
{
// Stores the number
// of cells
int area = 0;
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
// arr[i]][[j]==1 means that grid
// is filled by some rectangle
if (arr[i][j] == true) {
area++;
}
}
}
return area;
}
// Driver Code
int main()
{
int N = 3;
// (A[i][0], A[i][1]) denotes the
// coordinate of the bottom
// left of the rectangle
// (A[i][2], A[i][3]) denotes the
// coordinate of upper right
// of the rectangle
vector > A = {
{ 1, 3, 4, 5 },
{ 3, 1, 7, 4 },
{ 5, 3, 8, 6 }
};
// Update the coordinates that
// lie within the rectangle
for (int i = 0; i < N; i++) {
updateArray(A[i][0], A[i][1],
A[i][2], A[i][3]);
}
int area = findAreaCovered();
cout << area;
return 0;
}
Java
// Java program to find the number
// of cells enclosed by the given
// rectangles
class GFG{
static final int MAX = 1001;
static boolean [][]arr = new boolean[MAX][MAX];
// Update the coordinates lying
// within the rectangle
static void updateArray(int x1, int y1,
int x2, int y2)
{
for(int i = x1; i < x2; i++)
{
for(int j = y1; j < y2; j++)
{
// Update arr[i][j] for
// all (i, j) lying within
// the rectangle
arr[i][j] = true;
}
}
}
// Function to return the total
// area covered by rectangles
static int findAreaCovered()
{
// Stores the number
// of cells
int area = 0;
for(int i = 0; i < MAX; i++)
{
for(int j = 0; j < MAX; j++)
{
// arr[i]][[j]==1 means that grid
// is filled by some rectangle
if (arr[i][j] == true)
{
area++;
}
}
}
return area;
}
// Driver Code
public static void main(String[] args)
{
int N = 3;
// (A[i][0], A[i][1]) denotes the
// coordinate of the bottom
// left of the rectangle
// (A[i][2], A[i][3]) denotes the
// coordinate of upper right
// of the rectangle
int [][]A = { { 1, 3, 4, 5 },
{ 3, 1, 7, 4 },
{ 5, 3, 8, 6 } };
// Update the coordinates that
// lie within the rectangle
for(int i = 0; i < N; i++)
{
updateArray(A[i][0], A[i][1],
A[i][2], A[i][3]);
}
int area = findAreaCovered();
System.out.print(area);
}
}
// This code is contributed by amal kumar choubey
Python3
# Python3 program to find the
# number of cells enclosed
# by the given rectangles
MAX = 1001
arr = [[False for i in range(MAX)]
for j in range(MAX)]
# Update the coordinates lying
# within the rectangle
def updateArray(x1, y1, x2, y2):
for i in range(x1, x2):
for j in range(y1, y2):
# Update arr[i][j] for
# all (i, j) lying within
# the rectangle
arr[i][j] = True
# Function to return the total
# area covered by rectangles
def findAreaCovered():
# Stores the number
# of cells
area = 0
for i in range(MAX):
for j in range(MAX):
# arr[i]][[j]==1 means that grid
# is filled by some rectangle
if arr[i][j]:
area += 1
return area
# Driver code
if __name__=="__main__":
N = 3
# (A[i][0], A[i][1]) denotes the
# coordinate of the bottom
# left of the rectangle
# (A[i][2], A[i][3]) denotes the
# coordinate of upper right
# of the rectangle
A = [ [ 1, 3, 4, 5 ],
[ 3, 1, 7, 4 ],
[ 5, 3, 8, 6 ] ];
# Update the coordinates that
# lie within the rectangle
for i in range(N):
updateArray(A[i][0], A[i][1],
A[i][2], A[i][3]);
area = findAreaCovered();
print(area)
# This code is contributed by rutvik_56
C#
// C# program to find the number
// of cells enclosed by the given
// rectangles
using System;
class GFG{
static readonly int MAX = 1001;
static bool [,]arr = new bool[MAX, MAX];
// Update the coordinates lying
// within the rectangle
static void updateArray(int x1, int y1,
int x2, int y2)
{
for(int i = x1; i < x2; i++)
{
for(int j = y1; j < y2; j++)
{
// Update arr[i,j] for
// all (i, j) lying within
// the rectangle
arr[i, j] = true;
}
}
}
// Function to return the total
// area covered by rectangles
static int findAreaCovered()
{
// Stores the number
// of cells
int area = 0;
for(int i = 0; i < MAX; i++)
{
for(int j = 0; j < MAX; j++)
{
// arr[i],[j]==1 means that grid
// is filled by some rectangle
if (arr[i, j] == true)
{
area++;
}
}
}
return area;
}
// Driver Code
public static void Main(String[] args)
{
int N = 3;
// (A[i,0], A[i,1]) denotes the
// coordinate of the bottom
// left of the rectangle
// (A[i,2], A[i,3]) denotes the
// coordinate of upper right
// of the rectangle
int [,]A = { { 1, 3, 4, 5 },
{ 3, 1, 7, 4 },
{ 5, 3, 8, 6 } };
// Update the coordinates that
// lie within the rectangle
for(int i = 0; i < N; i++)
{
updateArray(A[i, 0], A[i, 1],
A[i, 2], A[i, 3]);
}
int area = findAreaCovered();
Console.Write(area);
}
}
// This code is contributed by Rajput-Ji
24
时间复杂度: O(N 3 )
辅助空间: O(N 2 )