【发布时间】:2019-03-12 01:27:53
【问题描述】:
代码需要在二维数组中找到距离小于
二维数组从最小距离到最大距离排序。
距离是从给定点(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);
}
【问题讨论】:
-
在函数
find_distance中else if为假时会发生什么?l和r保持不变。应该有另一个else吗?哦 - 不:代码令人困惑,因为您进行了两次相同的测试,而不是简单的else。 -
@WeatherVane 但是我用第一个 if 来涵盖所有这些......为什么它们会保持不变?
-
我更正了评论。
-
@WeatherVane 你知道这里有什么问题吗?
-
一开始我也是这么想的,但最好的办法是逐步调试调试器并找出它在做什么。我自己在二分搜索中的偏好是保持
r超出范围并在(r - l <= 1)时停止
标签: c arrays function loops multidimensional-array