第一种比较方案是一维线性空间中的大小,这基本上是按照数据在内存中的顺序进行排列的,一定意义上是地址越大 点就越大。这里由一道UVA题目中这样要求:在一定的二维数组中由n个已知的点,输入所有点后,分析其中的每一个点(x,y)输出一个坐标(ax,ay)使得ax>x且ay>y且使得ax尽量小的前提下使得ay尽量小。对于这样的状况,我进行了一个简单的设计,代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 struct point 8 { 9 int x,y; 10 int num; 11 int pi; 12 bool operator<(const point& rhs) 13 { 14 return this->num<rhs.num; 15 } 16 }; 17 const int maxn = 400; 18 //int X[maxn],Y[maxn]; 19 point aim[maxn]; 20 21 int main() 22 { 23 freopen("input.txt","r",stdin); 24 int n,a,b; 25 cin>>n; 26 for(int i=0;i<n;i++) 27 { 28 cin>>a>>b; 29 //X[i]=a;Y[i]=b; 30 aim[i].x=a; 31 aim[i].y=b; 32 aim[i].num=a*1000+b; 33 aim[i].pi=i; 34 } 35 sort(aim,aim+n); 36 // 37 // for(int i=0;i<n;i++) 38 // { 39 // printf("(%d,%d) num->%d ->%d ",aim[i].x,aim[i].y,aim[i].num,aim[i].pi); 40 // } 41 // 42 for(int i=0;i<n;i++) 43 { 44 for(int k=0;k<n;k++) 45 { 46 if(aim[k].pi!=i)continue; 47 bool no=true; 48 int px=aim[k].x,py=aim[k].y; 49 for(int p=k+1;p<n;p++) 50 { 51 if(aim[p].x>px&&aim[p].y>py) 52 { 53 printf("(%d,%d) ",aim[p].x,aim[p].y); 54 no=false;break; 55 } 56 } 57 if(no)printf("-1 "); 58 break; 59 } 60 } 61 return 0; 62 }
下面展示上面这个代码的运行情况,数据并未使用过于复杂的情形;
输入数据: 5 5 9 9 6 4 10 7 4 2 2
输出数据: (2,2) num->2002 ->4 (4,10) num->4010 ->2 (5,9) num->5009 ->0 (7,4) num->7004 ->3 (9,6) num->9006 ->1 -1 -1 -1 (9,6) (4,10)
第二种方案是距离原点的距离,这种情形的实现基本简单。对于(x,y)其距离是x*x+y*y(开根号与否自定);具体实现过程省略。