好的,首先,我显然是一个菜鸟,并为我的倒退思考道歉,或者如果我没有正确发布新网站的话。我相信有更好的方法可以解决这个问题,但如果你能忍受我并帮助我,那就太好了。
这个想法是给每对坐标一个距离值,然后选择最低距离值来找到最近的点。
首先,在创建对时首先要避免重复。
我想: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;
}
}
}
}
答案 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);
。如果存在平局,则列表将包含多个元素。