给定两个二维数组rectangle[][]和triangle[][] ,分别代表一个矩形和一个三角形的顶点坐标,另一个由N 个坐标组成的数组points[][] ,任务是计算位于矩形和三角形内的点。
例子:
Input: rectangle[][] = {{1, 1}, {6, 1}, {6, 6}, {1, 6}}, triangle[][] = {{4, 4}, {0, 4}, {0, -2}}, points[][] = {{6, 5}, {2, 2}, {2, 1}, {5, 5}}
Output: 2
Explanation:
From the above image, it is clear that the coordinates (2, 1) and (2, 2) lie inside both the given rectangle and triangle.
Therefore, the count is 2.
Input: rectangle[][] = {{-2, -2}, {2, -2}, {2, 2}, {-2, 2}}, triangle[][] = {{0, 0}, {1, 1}, {-1, -1}}, points[][] = {{0, 2}, {-2, -2}, {2, -2}}
Output: 2
方法:根据以下观察可以解决给定的问题:
Any three vertices of a rectangle can be connected to form a triangle.
Therefore, the number of triangles possible from a given rectangle is 4.
因此,解决问题的思路是检查给定点是否位于给定三角形内以及从该矩形获得的四个三角形中的任何一个。 F>请按照以下步骤解决问题:
- 初始化四个列表,比如triangle1、triangle2、triangle3和triangle4 ,以存储矩形中可能的四个三角形的顶点坐标。
- 通过一次考虑矩形的三个顶点来填充上述初始化列表。
- 初始化一个变量,比如ans为0 ,以存储位于三角形和矩形内的点数。
- 遍历数组points[][]并检查是否存在位于获得的四个三角形中的任何一个内以及给定三角形内的任何点。如果发现为真,则将ans增加1 。
- 完成上述步骤后,打印ans的值作为结果计数。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to calculate area of a triangle
int getArea(int x1,int y1,int x2,int y2,int x3,int y3)
{
// Return the resultant area
return abs((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2);
}
// Function to check if a point
// lies inside a triangle or not
int isInside(vector> triangle, vector point)
{
vector A = triangle[0];
vector B = triangle[1];
vector C = triangle[2];
int x = point[0];
int y = point[1];
// Calculate area of triangle ABC
int ABC = getArea(A[0], A[1],
B[0], B[1],
C[0], C[1]);
// Calculate area of triangle
// formed by connecting B, C, point
int BPC = getArea(x, y, B[0],
B[1], C[0],
C[1]);
// Calculate area of triangle
// formed by connecting A, C, point
int APC = getArea(A[0], A[1], x,
y, C[0], C[1]);
// Calculate area of triangle
// formed by connecting A, B, point
int APB = getArea(A[0], A[1], B[0],
B[1], x, y);
// Check if the sum of the areas of
// above three triangles the same as ABC
return ABC == (APC + APB + BPC);
}
// Function to count the number of points
// lying inside a triangle & rectangle
void countPoints(vector> rectangle,vector> triangle,vector> points){
// Stores the coordinates of the
// vertices of the triangles
int n = rectangle.size();
vector> triangle1;
for(int i = 1; i < n; i++) triangle1.push_back(rectangle[i]);
vector> triangle2;
for(int i = 0; i < 3; i++) triangle2.push_back(rectangle[i]);
vector> triangle3;
for(int i = 0; i < 2; i++) triangle3.push_back(rectangle[i]);
triangle3.push_back(rectangle[3]);
vector> triangle4;
for(int i = n - 2; i < n; i++) triangle4.push_back(rectangle[i]);
triangle4.push_back(rectangle[0]);
// Stores the number of points lying
// inside the triangle and rectangle
int ans = 0;
// Traverse the array of points
for(auto point:points)
{
// Stores whether the current point
// lies inside triangle1 or not
int condOne = isInside(triangle1, point);
// Stores whether the current point
// lies inside triangle2 or not
int condTwo = isInside(triangle2, point);
// Stores whether the current point
// lies inside triangle3 or not
int condThree = isInside(triangle3, point);
// Stores whether the current point
// lies inside triangle4 or not
int condFour = isInside(triangle4, point);
// Stores whether the current point
// lies inside given triangle or not
int condFive = isInside(triangle, point);
// If current point lies inside
// given triangle as well as inside
// any of the four obtained triangles
if ((condOne || condTwo || condThree || condFour) && condFive)
ans += 1;
}
// Print the count of points
cout << ans;
}
// Driver Code
int main()
{
vector> rectangle = {{6, 5}, {2, 2}, {2, 1}, {5, 5}};
vector> points = {{1, 1}, {6, 1}, {6, 6}, {1, 6}};
vector> triangle = {{4, 4}, {0, 4}, {0, -2}};
countPoints(points, triangle, rectangle);
return 0;
}
// This code is contributed by mohit kumar 29.
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG{
// Function to calculate area of a triangle
static int getArea(int x1, int y1, int x2,
int y2, int x3, int y3)
{
// Return the resultant area
return Math.abs((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2);
}
// Function to check if a point
// lies inside a triangle or not
static int isInside(ArrayList> triangle,
ArrayList point)
{
ArrayList A = triangle.get(0);
ArrayList B = triangle.get(1);
ArrayList C = triangle.get(2);
int x = point.get(0);
int y = point.get(1);
// Calculate area of triangle ABC
int ABC = getArea(A.get(0), A.get(1),
B.get(0), B.get(1),
C.get(0), C.get(1));
// Calculate area of triangle
// formed by connecting B, C, point
int BPC = getArea(x, y, B.get(0),
B.get(1), C.get(0),
C.get(1));
// Calculate area of triangle
// formed by connecting A, C, point
int APC = getArea(A.get(0), A.get(1), x,
y, C.get(0), C.get(1));
// Calculate area of triangle
// formed by connecting A, B, point
int APB = getArea(A.get(0), A.get(1), B.get(0),
B.get(1), x, y);
// Check if the sum of the areas of
// above three triangles the same as ABC
return ABC == (APC + APB + BPC) ? 1 :0;
}
// Function to count the number of points
// lying inside a triangle & rectangle
static void countPoints(ArrayList> rectangle,
ArrayList> triangle,
ArrayList> points)
{
// Stores the coordinates of the
// vertices of the triangles
int n = rectangle.size();
ArrayList> triangle1 = new ArrayList>();
for(int i = 1; i < n; i++)
triangle1.add(rectangle.get(i));
ArrayList> triangle2 = new ArrayList>();
for(int i = 0; i < 3; i++)
{
triangle2.add(rectangle.get(i));
}
ArrayList> triangle3 = new ArrayList>();
for(int i = 0; i < 2; i++)
{
triangle3.add(rectangle.get(i));
}
triangle3.add(rectangle.get(3));
ArrayList> triangle4 = new ArrayList>();
for(int i = n - 2; i < n; i++)
{
triangle4.add(rectangle.get(i));
}
triangle4.add(rectangle.get(0));
// Stores the number of points lying
// inside the triangle and rectangle
int ans = 0;
// Traverse the array of points
for(ArrayList point:points)
{
// Stores whether the current point
// lies inside triangle1 or not
int condOne = isInside(triangle1, point);
// Stores whether the current point
// lies inside triangle2 or not
int condTwo = isInside(triangle2, point);
// Stores whether the current point
// lies inside triangle3 or not
int condThree = isInside(triangle3, point);
// Stores whether the current point
// lies inside triangle4 or not
int condFour = isInside(triangle4, point);
// Stores whether the current point
// lies inside given triangle or not
int condFive = isInside(triangle, point);
// If current point lies inside
// given triangle as well as inside
// any of the four obtained triangles
if ((condOne != 0 || condTwo != 0 ||
condThree != 0 || condFour != 0) &&
condFive != 0)
ans += 1;
}
// Print the count of points
System.out.println(ans);
}
// Driver Code
public static void main (String[] args)
{
ArrayList> rectangle = new ArrayList>();
ArrayList> points = new ArrayList>();
ArrayList> triangle = new ArrayList>();
rectangle.add(new ArrayList(Arrays.asList(6, 5)));
rectangle.add(new ArrayList(Arrays.asList(2, 2)));
rectangle.add(new ArrayList(Arrays.asList(2, 1)));
rectangle.add(new ArrayList(Arrays.asList(5, 5)));
points.add(new ArrayList(Arrays.asList(1, 1)));
points.add(new ArrayList(Arrays.asList(6, 1)));
points.add(new ArrayList(Arrays.asList(6, 6)));
points.add(new ArrayList(Arrays.asList(1, 6)));
triangle.add(new ArrayList(Arrays.asList(4, 4)));
triangle.add(new ArrayList(Arrays.asList(0, 4)));
triangle.add(new ArrayList(Arrays.asList(0, -2)));
countPoints(points, triangle, rectangle);
}
}
// This code is contributed by avanitrachhadiya2155
Python3
# Python3 program for the above approach
# Function to calculate area of a triangle
def getArea(x1, y1, x2, y2, x3, y3):
# Return the resultant area
return abs((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2)
# Function to check if a point
# lies inside a triangle or not
def isInside(triangle, point):
A, B, C = triangle
x, y = point
# Calculate area of triangle ABC
ABC = getArea(A[0], A[1],
B[0], B[1],
C[0], C[1])
# Calculate area of triangle
# formed by connecting B, C, point
BPC = getArea(x, y, B[0],
B[1], C[0],
C[1])
# Calculate area of triangle
# formed by connecting A, C, point
APC = getArea(A[0], A[1], x,
y, C[0], C[1])
# Calculate area of triangle
# formed by connecting A, B, point
APB = getArea(A[0], A[1], B[0],
B[1], x, y)
# Check if the sum of the areas of
# above three triangles the same as ABC
return ABC == (APC + APB + BPC)
# Function to count the number of points
# lying inside a triangle & rectangle
def countPoints(rectangle, triangle, points):
# Stores the coordinates of the
# vertices of the triangles
triangle1 = rectangle[1:]
triangle2 = rectangle[:3]
triangle3 = rectangle[:2]
triangle3.append(rectangle[3])
triangle4 = rectangle[-2:]
triangle4.append(rectangle[0])
# Stores the number of points lying
# inside the triangle and rectangle
ans = 0
# Traverse the array of points
for point in points:
# Stores whether the current point
# lies inside triangle1 or not
condOne = isInside(triangle1, point)
# Stores whether the current point
# lies inside triangle2 or not
condTwo = isInside(triangle2, point)
# Stores whether the current point
# lies inside triangle3 or not
condThree = isInside(triangle3, point)
# Stores whether the current point
# lies inside triangle4 or not
condFour = isInside(triangle4, point)
# Stores whether the current point
# lies inside given triangle or not
condFive = isInside(triangle, point)
# If current point lies inside
# given triangle as well as inside
# any of the four obtained triangles
if (condOne or condTwo or condThree \
or condFour) and condFive:
ans += 1
# Print the count of points
print(ans)
# Driver Code
rectangle = [[6, 5], [2, 2], [2, 1], [5, 5]]
points = [[1, 1], [6, 1], [6, 6], [1, 6]]
triangle = [[4, 4], [0, 4], [0, -2]]
countPoints(points, triangle, rectangle)
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
public class GFG
{
// Function to calculate area of a triangle
static int getArea(int x1, int y1, int x2,
int y2, int x3, int y3)
{
// Return the resultant area
return Math.Abs((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2);
}
// Function to check if a point
// lies inside a triangle or not
static int isInside(List> triangle,
List point)
{
List A = triangle[0];
List B = triangle[1];
List C = triangle[2];
int x = point[0];
int y = point[1];
// Calculate area of triangle ABC
int ABC = getArea(A[0], A[1],
B[0], B[1],
C[0], C[1]);
// Calculate area of triangle
// formed by connecting B, C, point
int BPC = getArea(x, y, B[0],
B[1], C[0],
C[1]);
// Calculate area of triangle
// formed by connecting A, C, point
int APC = getArea(A[0], A[1], x,
y, C[0], C[1]);
// Calculate area of triangle
// formed by connecting A, B, point
int APB = getArea(A[0], A[1], B[0],
B[1], x, y);
// Check if the sum of the areas of
// above three triangles the same as ABC
return ABC == (APC + APB + BPC) ? 1 :0;
}
// Function to count the number of points
// lying inside a triangle & rectangle
static void countPoints(List> rectangle,
List> triangle,
List> points)
{
// Stores the coordinates of the
// vertices of the triangles
int n = rectangle.Count;
List> triangle1 = new List>();
for(int i = 1; i < n; i++)
triangle1.Add(rectangle[i]);
List> triangle2 = new List>();
for(int i = 0; i < 3; i++)
{
triangle2.Add(rectangle[i]);
}
List> triangle3 = new List>();
for(int i = 0; i < 2; i++)
{
triangle3.Add(rectangle[i]);
}
triangle3.Add(rectangle[3]);
List> triangle4 = new List>();
for(int i = n - 2; i < n; i++)
{
triangle4.Add(rectangle[i]);
}
triangle4.Add(rectangle[0]);
// Stores the number of points lying
// inside the triangle and rectangle
int ans = 0;
// Traverse the array of points
foreach(List point in points)
{
// Stores whether the current point
// lies inside triangle1 or not
int condOne = isInside(triangle1, point);
// Stores whether the current point
// lies inside triangle2 or not
int condTwo = isInside(triangle2, point);
// Stores whether the current point
// lies inside triangle3 or not
int condThree = isInside(triangle3, point);
// Stores whether the current point
// lies inside triangle4 or not
int condFour = isInside(triangle4, point);
// Stores whether the current point
// lies inside given triangle or not
int condFive = isInside(triangle, point);
// If current point lies inside
// given triangle as well as inside
// any of the four obtained triangles
if ((condOne != 0 || condTwo != 0 ||
condThree != 0 || condFour != 0) &&
condFive != 0)
ans += 1;
}
// Print the count of points
Console.WriteLine(ans);
}
// Driver Code
static public void Main ()
{
List> rectangle = new List>();
List> points = new List>();
List> triangle = new List>();
rectangle.Add(new List(){6, 5});
rectangle.Add(new List(){2, 2});
rectangle.Add(new List(){2, 1});
rectangle.Add(new List(){5, 5});
points.Add(new List(){1, 1});
points.Add(new List(){6, 1});
points.Add(new List(){6, 6});
points.Add(new List(){1, 6});
triangle.Add(new List(){4, 4});
triangle.Add(new List(){0, 4});
triangle.Add(new List(){0, -2});
countPoints(points, triangle, rectangle);
}
}
// This code is contributed by rag2127
Javascript
2
时间复杂度: O(N)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。