JAVA - 检查值是否不在其他索引2D数组中

时间:2013-04-25 10:26:56

标签: java arrays 2d

我坚持学校项目的这一部分,我必须在两个坐标(旅行推销员问题)之间获得最短的路线。我在这里做了一些事情,以获得最近邻居的合作,但是一些合作伙伴拥有相同的最近邻居,我不想要那样。

我想到要清楚这个问题,但它没有用,我无法弄清楚原因。

distance是当前位置与其他位置之间的当前距离。我认为shortestDistance有点说话。

locations[20][3]是一个2D数组,我在其中存储每个co-ord的Xco-ord,Yco-ord和最近邻居。 X在[x] [0]中,[x] [1]中的Y和[x]中的邻域[2]

for(int i = 0; i < 20; i++){
            int shortestDistance = 100;
            int distance;
            //Looking for nearest neighbour 20 times 
            for(int j = 0; j < 20; j++){
                //Looking for the closest neighbour here
                distanceX = locations[i][0] - locations[j][0];
                distanceY = locations[i][1] - locations[j][1];
                //To prevent a negative distance:
                if(distanceX < 0){
                    distanceX = distanceX * -1; 
                }
                if(distanceY < 0){
                    distanceY = distanceY * -1;
                }
                //Add distance
                distance = distanceX + distanceY;
                //If current distance is shorter then the shortestdistance, to prevent it does'nt see itself as 'neighbour' and to prevent another co-ord has the same neighbour, which happens in isOk(); 
                if(distance < shortestDistance && distanceX + distanceY != 0 && isOk(j)){
                    shortestDistance = distance;
                    locations[i][2] = j;
                }
            }
        }

功能isOk是:

private boolean isOk(int j){
    boolean result = false;
    for(int i = 0; i < 20; i++){
        if(locations[i][2] == j){
            result = false;
        }
        else{
            result = true;
        }
    }
    return result;
}

所以,我问的是我做错了什么?我仍然得到一些与其最近邻居具有相同项目的项目(在20 * 10存储中)。

1 个答案:

答案 0 :(得分:1)

您可能必须将邻居初始化为适合您的isOK方法的内容。这样的值例如是-1。

for(int i = 0; i < 20; i++) locations[i][2] = -1;

isOk也包含一个小错误。当j被发现为另一个位置的邻居时,应该停止循环:

private boolean isOk(int j){
    for(int i = 0; i < 20; i++){
        if (locations[i][2] == j) return false;
    }
    return true;
}