代码需要在2d数组中找到距离小于<(square(d))的max元素。
二维数组从最小距离到最大距离排序。
从给定点(x,y)计算距离,例如: 如果我们有一个点(0,0)和二维数组(已排序){{3,0},{3,-1},{3,3},{5,0},{7,2}}。并且d =(square(11)),则数组(0,0)中小于d的最大距离元素点为{3,-1},该函数需要返回(1),因为它是数组中的下一个元素。
现在问题是代码输出3而不是1 ... !!! ?? (请注意,我没有在代码中使用sqrt()函数,而是使用d * d)。
#include <stdio.h>
#define X 0
#define Y 0
int square(int x);
int diff(int a, int b);
int find_distance(int points[][2], int n, int d);
int diff(int a, int b){
int dis=square(a-X)+square(b-Y);
return dis;
}
int square(int x){
return x*x;
}
int find_distance(int p[][2], int n, int d){
int l=0, r=n-1, max=-1;
while (l<r){
int mid=(l+r)/2;
if(diff(p[mid][0], p[mid][1])>= d*d)
r=mid-1;
else if (diff(p[mid][0],p[mid][1])<d*d){
if (max<mid)
max=mid;
l=mid+1;
}
}
return max;
}
int main(){
int p[5][2]={{3,0},{3,-1},{3,3},{5,0},{7,2}};
int max=find_distance(p, 5, 11);
printf("%d, %d", max, X);
}
答案 0 :(得分:0)
根据问题最大元素位于第4个索引, (7)^ 2 +(2)^ 2 = 53 <121。
int find_distance(int p[][2], int n, int d){
int l=0, r=n-1, max=-1;
while (l<=r)/*here l<=r because the largest
element is at 4th index*/{
int mid=(l+r)/2;
if(diff(p[mid][0], p[mid][1])>= d*d)
r=mid-1;
else if (diff(p[mid][0],p[mid][1])<d*d){
if (max<mid)
max=mid;
l=mid+1;
}
}
return max;//4
}