【问题标题】:Why is my code not running the function correctly为什么我的代码没有正确运行函数
【发布时间】: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_distanceelse if 为假时会发生什么? lr 保持不变。应该有另一个else 吗?哦 - 不:代码令人困惑,因为您进行了两次相同的测试,而不是简单的 else
  • @WeatherVane 但是我用第一个 if 来涵盖所有这些......为什么它们会保持不变?
  • 我更正了评论。
  • @WeatherVane 你知道这里有什么问题吗?
  • 一开始我也是这么想的,但最好的办法是逐步调试调试器并找出它在做什么。我自己在二分搜索中的偏好是保持r 超出范围并在(r - l &lt;= 1) 时停止

标签: c arrays function loops multidimensional-array


【解决方案1】:

根据问题,最大元素位于第 4 个索引处 (7)^2+(2)^2=53

   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
}

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2021-10-17
    • 1970-01-01
    • 2022-01-23
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多