zoukankan      html  css  js  c++  java
  • 找到集合 P 中的所有 ”最大“ 点的集合

    题目描述

    P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

    如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。

    例子:

    input:

    5
    1 2
    5 3
    4 6
    7 5
    9 0

    output:

    4 6
    7 5
    9 0

    代码实现

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    class MaxPointDraw:
        def __init__(self):
            self.xy = []
            self.max_x = 0
            self.max_y = 0
    
        def generateCoordinateCollection(self):
            number = int(input('please input a number(1 <= number <= 10000):'))
            for i in range(number):
                input_xy = input()
                x = int(input_xy.split(' ')[0])
                y = int(input_xy.split(' ')[1])
                if x > self.max_x:
                    self.max_x = x
                if y > self.max_y:
                    self.max_y = y
                self.xy.append([x, y])
    
        def checkIsMaxPoint(self, xy_args):
            x = xy_args[0]
            y = xy_args[1]
            for xy_list in self.xy:
                x_value = xy_list[0]
                y_value = xy_list[1]
                if x_value > x and y_value > y:
                    return False
            return True
        
        def Output(self):
            print('--------------------')
            for xy_list in self.xy:
                x_value = xy_list[0]
                y_value = xy_list[1]
                if self.checkIsMaxPoint(xy_list):
                    print(' '.join(['%s'%xy for xy in xy_list]))
    
    if __name__ == "__main__":
        mpd = MaxPointDraw()
        mpd.generateCoordinateCollection()
        mpd.Output()

    输出:

    please input a number(1 <= number <= 10000):5
    1 2
    5 3
    4 6
    7 5
    9 0
    --------------------
    4 6
    7 5
    9 0

    拓展

    使用matplotlib来展示效果,以及随机生成一个点集合:

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    from random import randint
    import matplotlib.pyplot as plt
    
    
    class MaxPointDraw:
        def __init__(self):
            self.xy = []
            self.max_x = 0
            self.max_y = 0
        # generate CoordinateCollection
        def generateCoordinateCollection(self):
            number = int(input('please input a number(1 <= number <= 10000):'))
            for i in range(number):
                x = randint(0, number)
                y = randint(0, number)
                if x > self.max_x:
                    self.max_x = x
                if y > self.max_y:
                    self.max_y = y
                self.xy.append([x, y])
    
        # check the point is Max or not
        def checkIsMaxPoint(self, xy_args):
            x = xy_args[0]
            y = xy_args[1]
            for xy_list in self.xy:
                x_value = xy_list[0]
                y_value = xy_list[1]
                if x_value > x and y_value > y:
                    return False
            return True
        # show the MaxPoint result
        def DrawPaint(self):
            fig = plt.figure()
            ax = fig.add_subplot(111)
            ax.set(xlim=[0, self.max_x+self.max_x//2], ylim=[0, self.max_y+self.max_y//2], title='Max Point Set',
                   ylabel='Y-Axis', xlabel='X-Axis')
            for xy_list in self.xy:
                x_value = xy_list[0]
                y_value = xy_list[1]
                if self.checkIsMaxPoint(xy_list):
                    plt.scatter([x_value], [y_value], color='red')
                else:
                    plt.scatter([x_value], [y_value], color='blue')
            plt.show()
    
    
    if __name__ == "__main__":
        mpd = MaxPointDraw()
        mpd.generateCoordinateCollection()
        mpd.DrawPaint()

    input1:

    please input a number(1 <= number <= 10000):10

    result1:

    input2:

    please input a number(1 <= number <= 10000):50

    output2:

    效果就是上面的样子,复制代码后运行前需要pip install matplotlib 不然会找不到这个包。

    不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
  • 相关阅读:
    10 Programming Languages You Should Learn Right Now
    【Vegas原创】asp.net页面作为邮件正文发送
    【Vegas原创】产生文件编号(形如:SC000610001)
    ASP操作Excel技术总结
    【Vegas原创】asp/html页面作为邮件正文发送
    【Vegas原创】jmail 发邮件
    ADO.NET 如何读取 Excel (下)
    【Vegas原创】Ajax实现无刷新三联动
    【Vegas原创】Excel权限问题
    成为编程高手的八大奥秘
  • 原文地址:https://www.cnblogs.com/yunhgu/p/13865469.html
Copyright © 2011-2022 走看看