码迷,mamicode.com
首页 > 其他好文 > 详细

1230:寻找平面上的极大点

时间:2020-02-23 11:25:07      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:return   png   数组   计数器   16px   ace   个数   nbsp   class   

技术图片

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

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

          我定义了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:寻找平面上的极大点

标签:return   png   数组   计数器   16px   ace   个数   nbsp   class   

原文地址:https://www.cnblogs.com/zkw666/p/12348756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!