📜  查找上,下,左或右至少有1个点的点数

📅  最后修改于: 2021-04-29 12:50:06             🧑  作者: Mango

在二维平面中给定N个点。如果两个点的X坐标相同并且第一个点的Y坐标大于第二个点的Y坐标,则称该点在另一个点的上方。同样,我们在下方定义左右。任务是计算在其上,下,左或右至少有一个点的点数。

例子:

方法:对于每个X坐标,在具有该X坐标的所有点中找到2个值,即最小和最大Y坐标。对每个Y坐标执行相同的操作。现在,要满足约束条件的点,其Y坐标必须位于该X坐标的2个计算值之间。检查同一事物的X坐标。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define MX 2001
#define OFF 1000
  
// Represents a point in 2-D space
struct point {
    int x, y;
};
  
// Function to return the count of
// required points
int countPoints(int n, struct point points[])
{
    int minx[MX];
    int miny[MX];
  
    // Initialize minimum values to infinity
    fill(minx, minx + MX, INT_MAX);
    fill(miny, miny + MX, INT_MAX);
  
    // Initialize maximum values to zero
    int maxx[MX] = { 0 };
    int maxy[MX] = { 0 };
    int x, y;
    for (int i = 0; i < n; i++) {
  
        // Add offset to deal with negative 
        // values
        points[i].x += OFF;
        points[i].y += OFF;
        x = points[i].x;
        y = points[i].y;
  
        // Update the minimum and maximum
        // values
        minx[y] = min(minx[y], x);
        maxx[y] = max(maxx[y], x);
        miny[x] = min(miny[x], y);
        maxy[x] = max(maxy[x], y);
    }
  
    int count = 0;
    for (int i = 0; i < n; i++) {
        x = points[i].x;
        y = points[i].y;
  
        // Check if condition is satisfied 
        // for X coordinate
        if (x > minx[y] && x < maxx[y])
  
            // Check if condition is satisfied
            // for Y coordinate
            if (y > miny[x] && y < maxy[x])
                count++;
    }
    return count;
}
  
// Driver code
int main()
{
    struct point points[] = { { 0, 0 },
                              { 0, 1 },
                              { 1, 0 },
                              { 0, -1 },
                              { -1, 0 } };
    int n = sizeof(points) / sizeof(points[0]);
    cout << countPoints(n, points);
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG 
{
static int MX = 2001;
static int OFF = 1000;
  
// Represents a point in 2-D space
static class point 
{
    int x, y;
  
    public point(int x, int y) 
    {
        this.x = x;
        this.y = y;
    }
      
};
  
// Function to return the count of
// required points
static int countPoints(int n, point points[])
{
    int []minx = new int[MX];
    int []miny = new int[MX];
  
    // Initialize minimum values to infinity
    for (int i = 0; i < n; i++)
    {
        minx[i]=Integer.MAX_VALUE;
        miny[i]=Integer.MAX_VALUE;
    }
  
    // Initialize maximum values to zero
    int []maxx = new int[MX];
    int []maxy = new int[MX];
  
    int x, y;
    for (int i = 0; i < n; i++)
    {
  
        // Add offset to deal with negative 
        // values
        points[i].x += OFF;
        points[i].y += OFF;
        x = points[i].x;
        y = points[i].y;
  
        // Update the minimum and maximum
        // values
        minx[y] = Math.min(minx[y], x);
        maxx[y] = Math.max(maxx[y], x);
        miny[x] = Math.min(miny[x], y);
        maxy[x] = Math.max(maxy[x], y);
    }
  
    int count = 0;
    for (int i = 0; i < n; i++) 
    {
        x = points[i].x;
        y = points[i].y;
  
        // Check if condition is satisfied 
        // for X coordinate
        if (x > minx[y] && x < maxx[y])
  
            // Check if condition is satisfied
            // for Y coordinate
            if (y > miny[x] && y < maxy[x])
                count++;
    }
    return count;
}
  
// Driver code
public static void main(String[] args)
{
    point points[] = {new point(0, 0),
                      new point(0, 1),
                      new point(1, 0),
                      new point(0, -1),
                      new point(-1, 0)};
    int n = points.length;
    System.out.println(countPoints(n, points));
}
} 
  
// This code is contributed by PrinciRaj1992


Python3
# Python3 implementation of the approach
from sys import maxsize as INT_MAX
  
MX = 2001
OFF = 1000
  
# Represents a point in 2-D space
class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
  
# Function to return the count of
# required points
def countPoints(n: int, points: list) -> int:
  
    # Initialize minimum values to infinity
    minx = [INT_MAX] * MX
    miny = [INT_MAX] * MX
  
    # Initialize maximum values to zero
    maxx = [0] * MX
    maxy = [0] * MX
    x, y = 0, 0
    for i in range(n):
  
        # Add offset to deal with negative
        # values
        points[i].x += OFF
        points[i].y += OFF
        x = points[i].x
        y = points[i].y
  
        # Update the minimum and maximum
        # values
        minx[y] = min(minx[y], x)
        maxx[y] = max(maxx[y], x)
        miny[x] = min(miny[x], y)
        maxy[x] = max(maxy[x], y)
  
    count = 0
    for i in range(n):
        x = points[i].x
        y = points[i].y
  
        # Check if condition is satisfied
        # for X coordinate
        if (x > minx[y] and x < maxx[y]):
  
            # Check if condition is satisfied
            # for Y coordinate
            if (y > miny[x] and y < maxy[x]):
                count += 1
  
    return count
  
# Driver Code
if __name__ == "__main__":
  
    points = [point(0, 0),
              point(0, 1),
              point(1, 0),
              point(0, -1),
              point(-1, 0)]
    n = len(points)
  
    print(countPoints(n, points))
  
# This code is contributed by
# sanjeev2552


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
  
class GFG 
{
static int MX = 2001;
static int OFF = 1000;
  
// Represents a point in 2-D space
public class point 
{
    public int x, y;
  
    public point(int x, int y) 
    {
        this.x = x;
        this.y = y;
    }
};
  
// Function to return the count of
// required points
static int countPoints(int n, point []points)
{
    int []minx = new int[MX];
    int []miny = new int[MX];
  
    // Initialize minimum values to infinity
    for (int i = 0; i < n; i++)
    {
        minx[i]=int.MaxValue;
        miny[i]=int.MaxValue;
    }
  
    // Initialize maximum values to zero
    int []maxx = new int[MX];
    int []maxy = new int[MX];
  
    int x, y;
    for (int i = 0; i < n; i++)
    {
  
        // Add offset to deal with negative 
        // values
        points[i].x += OFF;
        points[i].y += OFF;
        x = points[i].x;
        y = points[i].y;
  
        // Update the minimum and maximum
        // values
        minx[y] = Math.Min(minx[y], x);
        maxx[y] = Math.Max(maxx[y], x);
        miny[x] = Math.Min(miny[x], y);
        maxy[x] = Math.Max(maxy[x], y);
    }
  
    int count = 0;
    for (int i = 0; i < n; i++) 
    {
        x = points[i].x;
        y = points[i].y;
  
        // Check if condition is satisfied 
        // for X coordinate
        if (x > minx[y] && x < maxx[y])
  
            // Check if condition is satisfied
            // for Y coordinate
            if (y > miny[x] && y < maxy[x])
                count++;
    }
    return count;
}
  
// Driver code
public static void Main(String[] args)
{
    point []points = {new point(0, 0),
                      new point(0, 1),
                      new point(1, 0),
                      new point(0, -1),
                      new point(-1, 0)};
    int n = points.Length;
    Console.WriteLine(countPoints(n, points));
}
}
  
// This code is contributed by 29AjayKumar


输出:
1

时间复杂度: O(N)