制定一个基本程序来找到一对最近的点并且我被困

时间:2017-01-25 06:04:54

标签: coordinates

好的,首先,我显然是一个菜鸟,并为我的倒退思考道歉,或者如果我没有正确发布新网站的话。我相信有更好的方法可以解决这个问题,但如果你能忍受我并帮助我,那就太好了。

这个想法是给每对坐标一个距离值,然后选择最低距离值来找到最近的点。

首先,在创建对时首先要避免重复。

我想:AB AC AD AE BC BD BE CD CE DE

但取而代之的是:AB AC AD AE BA BC BD BE CA CB CD CE DA DB DC DE EA EB EC ED

第二,一旦找到最低距离值,我就无法想出一个很好的方法来引用回原始坐标对。我正在考虑使用模数而不是idk。

最后如何查找最近的两个是否有平局。

public static void main(String[] args) {
    int a[][] = new int[5][2];
    int b[] = new int[20];
    int c[] = new int[20];
    int d[] = new int[20];
    int sum = 0;
    int count = 0;
    int temp = 0;
    for (int i = 0 ; i < a.length ; i++ ) { 
        for (int j = 0 ; j < a[i].length ; j++ ) { 
            a[i][j] = (int)(Math.random() * 10);
            }
    }
    for (int i = 0 ; i < a.length ; i++ ) { 
        for (int j = 0 ; j < a[i].length ; j++ ) { 
            System.out.print(a[i][j]);

        }
        System.out.println(" ");
    }

    for (int i = 0 ; i < a.length ; i++ ) { 
        for (int j = 0 ; j < a.length ; j++ ) {
            if(i == j){}
            else{
            temp =  a[i][0]- a[j][0];
            temp= Math.abs(temp);
            b[count]=temp;
            count++;
            }
        }
    }
    count=0;
    for (int i = 0 ; i < a.length ; i++ ) { 
        for (int j = 0 ; j < a.length ; j++ ) {
            if(i == j){
            }
            else{
            temp =  a[i][1]- a[j][1];
            temp= Math.abs(temp);
            c[count]=temp;
            count++;
            }
        }
    }        

    for (int i = 0 ; i < b.length ; i++ ) { 
        System.out.println(b[i]+ " " + c[i]);
    }

    System.out.println(" ");

    for (int i =0 ; i<d.length;i++){
        d[i]=b[i]+c[i];
    }
    for (int i = 0 ; i < d.length ; i++ ) { 
        System.out.println(d[i]);
    }
    System.out.println(" ");
    for (int i = 0 ; i < d.length ; i++ ) { 
        if (d[i]== 0){
            System.out.println(i);
            break;
        }
        else if(d[i]== 1){
            System.out.println(i);
            break;
        }
        else if (d[i]== 2){
            System.out.println(i);
            break;
        }

    } 
}

}

1 个答案:

答案 0 :(得分:0)

蛮力解决方案是将所有点都放在列表中,然后在每个点检查到所有其他点的距离,如果它是最短的,则暂时保存该对。一旦考虑完所有,临时变量中的对是最接近的。这可以稍微优化,不通过更改内部循环计数器的初始值来检查重复项:

temp = (null,null,-1);
for (int i=0; i < size; i++) {
  p1 = ps[i];
  for (int n=i+1; n < size; n++) { //add 1 as I assume p1,p1 is not a viable pair
    p2 = ps[n]
    dist = |p1-p2|
    if (temp[2] == -1 || dist < temp[2]) {
      temp = (p1, p2, dist);
    }
  }
}
return temp;

除此之外,我建议你开始阅读与空间属性相关的数据结构(四叉树,kd树等)。许多在全球拥有积分的游戏和应用程序都使用这些游戏和应用程序,以确保您不必搜索可疑的长点列表。

编辑:注意到你也想要领带。为此,您可以设置temp = [dist, new List<(point,point)>],如果temp[0]==dist您将该对添加到列表temp[1].add((p1,p2)),则可以Ship lilCutie; lilCutie.setName("Boat"); lilCutie.setYear(1993); 。如果存在平局,则列表将包含多个元素。