2017-01-25 1 views
0

처음에는 분명히 멍청한데, 거꾸로 생각하거나, 정확하게 사이트에 새로운 것을 게시하지 않은 것을 사과드립니다. 나는 이것에 관해 갈 무한한 더 좋은 방법이 있다고 확신하지만, 나와 함께 견딜 수 있고 나를 도와 주면 위대 할 것입니다.가장 가까운 점수를 얻는 초보자 용 프로그램을 만들고 붙어 있어요

아이디어는 각 좌표 쌍에 거리 값을 부여한 다음 가장 가까운 거리 값을 선택하여 가장 가까운 점을 찾는 것입니다.

먼저 쌍을 만들 때 중복을 피하는 데 어려움이 있습니다.

내가 원하는 : AB AC 광고 AE BA BC BD는 CA CB CD CE DA DB DC DE EA EB EC ED

둘째 BE : AB AC 광고 AE BC BD가

대신 점점 CD CE DE BE 가장 낮은 거리 값을 찾으면 원래 좌표 쌍을 다시 참조하는 좋은 방법을 생각할 수 없습니다. modulus하지만 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

무차별 솔루션은 목록에있는 모든 지점이하는 것입니다 어디를 다음이 짧은 경우 일시적으로 쌍을 저장하는 다른 모든 점에 각 지점 확인 거리에. 모든 것이 고려되면, 임시 변수의 쌍이 가장 가까운 변수입니다. 이것은 약간 내부 루프의 초기 값을 변경을 통해 중복을 확인하지 최적화 할 수는 카운터 : 이것보다

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)) 목록에 해당 쌍을 추가 할 수 있습니다. 동점이 있으면 목록에 요소가 두 개 이상 있습니다.

관련 문제