1230:寻找平面上的极大点

Posted zkw666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1230:寻找平面上的极大点相关的知识,希望对你有一定的参考价值。

技术图片

          这个题我写的十分繁琐,可能没找到正确的思路,不过我也是勉强过了。

          我的思路是挨个判断点的横、纵坐标,如果有点的横、纵坐标都小于某个点,就将横、纵坐标小的那个点排除。再继续判断。

          我定义了a,b两个数组,分别存储点的横、纵坐标。之后将a数组从小到大排序,在套两个循环,将纵坐标在于横坐标对应上:

 1 sort(a+1,a+n+1);
 2     for(int i=1;i<=n;++i)
 3     {
 4         for(int j=1;j<=n;++j)
 5         {
 6             if(a[i]==c[j])
 7             {
 8                 b[i]=d[j];
 9                 c[j]=0;
10                 break;
11             }
12         }
13     }

我又定义了c,d两个数组,c数组与a数组相同,d数组与b数组相同。这样就能再将点的横、纵坐标匹配上。

接下来就要判断点坐标之间的关系:如果有的点的横、纵坐标都小于某个点,那么这个点肯定不是极大点,所以就可以把它的横、纵坐标都定义为0,就可以把它排除。

 1 for(int i=1;i<=n;++i)
 2     {
 3         for(int j=1;j<=n;++j)
 4         {
 5             if(a[i]>=a[j] && b[i]>=b[j])
 6             {
 7                 if(a[i]==a[j] && b[i]==b[j])
 8                 {
 9                     continue;
10                 }
11                 else
12                 {
13                     a[j]=0;
14                     b[j]=0;
15                 }
16             }
17         }
18     }

在输出前还要判断n即一共给的点的个数,如果n=1,直接输出这个点。

1 if(n==1)
2     {
3         cout<<"("<<a[1]<<","<<b[1]<<")";
4     }

还有“,”的问题,可以先循环一下,用一个计数器记录一共有多少个极大点,最后先输出前几个,直到剩下一个点的时候,就再单独输出。

1 for(int i=1;i<=n;++i)
2     {
3         if(a[i]>0 || b[i]>0)
4         {
5             s++;
6         }
7     }

s就是计数器,记录极大点个数。

完整代码:

  1 #include<iostream>
  2 #include<algorithm>
  3 using namespace std;
  4 int main()
  5 {
  6     int m,t=0,s=0,n,a[110],b[110],c[110],d[110];
  7     cin>>n;
  8     for(int i=1;i<=n;++i)
  9     {
 10         cin>>a[i]>>b[i];
 11         c[i]=a[i];
 12         d[i]=b[i];
 13     }
 14     if(n==1)
 15     {
 16         cout<<"("<<a[1]<<","<<b[1]<<")";
 17     }
 18     else
 19     {
 20     sort(a+1,a+n+1);
 21     for(int i=1;i<=n;++i)
 22     {
 23         for(int j=1;j<=n;++j)
 24         {
 25             if(a[i]==c[j])
 26             {
 27                 b[i]=d[j];
 28                 c[j]=0;
 29                 break;
 30             }
 31         }
 32     }
 33     for(int i=1;i<=n;++i)
 34     {
 35         for(int j=1;j<=n;++j)
 36         {
 37             if(a[i]>=a[j] && b[i]>=b[j])
 38             {
 39                 if(a[i]==a[j] && b[i]==b[j])
 40                 {
 41                     continue;
 42                 }
 43                 else
 44                 {
 45                     a[j]=0;
 46                     b[j]=0;
 47                 }
 48             }
 49         }
 50     }
 51     for(int i=1;i<=n;++i)
 52     {
 53         if(a[i]>0 || b[i]>0)
 54         {
 55             s++;
 56         }
 57     }
 58     if(s==1)
 59     {
 60         for(int i=1;i<=n;++i)
 61         {
 62             if(a[i]>0 || b[i]>0)
 63             {
 64                 cout<<"("<<a[i]<<","<<b[i]<<")";
 65                 break;
 66             }
 67         }
 68     }
 69      else
 70      {
 71      for(int j=1;j<=n;++j)
 72      {
 73         if(a[j]==0 && b[j]==0)
 74         {
 75             continue;
 76         }
 77         else
 78         {
 79             cout<<"("<<a[j]<<","<<b[j]<<")"<<",";
 80             t++;
 81         }
 82         if(t==s-1)
 83         {
 84             m=j;
 85             break;
 86         }
 87      }
 88      for(int i=m+1;i<=n;++i)
 89      {
 90         if(a[i]==0 && b[i]==0)
 91         {
 92             continue;
 93         }
 94         else
 95         {
 96             cout<<"("<<a[i]<<","<<b[i]<<")";
 97         }
 98      }
 99      }
100     }
101     return 0;
102 }

 

以上是关于1230:寻找平面上的极大点的主要内容,如果未能解决你的问题,请参考以下文章

平面最近点对(分治nlogn)

从平面方程生成点网格的算法[关闭]

2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。力扣149。(代码片

平面坐标系中,求点在线上的投影坐标(如图)

分治 -- 平面最近点对

opengl中3d空间平面上的程序网格