Java中的旅行路线

时间:2014-02-22 10:28:56

标签: java

我对Java有非常基础的知识。我尝试了下面的问题并在某些情况下失败(我知道该程序肯定是不正确的)。有人可以帮助我,用Java解决这个问题吗?

将下表表示为静态结构,并编写一个有效输出所有可能路径的函数find_routes(source,destination)。

**Source**      **Destination**
Seattle         LA
LA              Florida
LA              Maine
Florida         Seattle
Seattle         Florida

Ex: find_routes('Seattle','Florida')的解决方案应该是[Seattle - >佛罗里达州,西雅图 - > LA - >佛罗里达]

我尝试过如下,但是在更改目的地时失败了:

public class FindPossibleRoutes {
    static boolean nextItr=true;
    public static void main(String rgs[])
{
        String[] source={"Seattle","LA","LA","Florida","Seattle"};
        String[] dest={"LA","Florida","Maine","Seattle","Florida"};
        find_routes("Seattle", "Florida",source,dest);
    }
    public static void find_routes(String s, String d, String[] sa, String[] da) {
        for(int i=0;i<sa.length;i++)
        {
        if(sa[i].equals(s)&&nextItr==true)
        {
            System.out.println(s+"-->"+da[i]);
            if(!(da[i].equals(d)))
            {
                find_routes(da[i],d,sa,da);
            }
            else {
                   nextItr=false;
                   break;
                }
        }   
    }
    }
}

1 个答案:

答案 0 :(得分:2)

由于您的方法已经不适合find_routes(source, destination),我认为可以添加另一个参数find_routes(source, destination, currentRoute)

首先,你必须在你的问题中写出“静态结构”。那些就像是:

private static String[] sourceArray      = {"Seattle", "LA",      "LA",    "Florida", "Seattle"};
private static String[] destinationArray = {"LA",      "Florida", "Maine", "Seattle", "Florida"};

然后当然这是一个递归问题。所以你必须找到递归锚点。在继续阅读之前,请花点时间思考一下。

  

当源与目标相同时,递归锚很明显。

因此,在找到递归锚之后,您只需添加后续步骤。您将相应目的地作为新来源的想法已经是正确的方法。 你不做的是保存后续步骤。

为此,我使用第三个参数:currentRoute。它被初始化为空列表,并始终使用当前节点进行扩展。如果我们最终到达递归锚点,我们可以将当前路由添加到路由列表中。

如果我们不在递归锚点,我们还必须检查周期。为了避免这些,我们可以查看当前节点已经在内部的currentRoute。请注意,对于庞大的数据集,您现在仍然可以达到堆栈限制,因此需要一些额外的帮助程序(例如,截止深度)。

package sto;

import java.util.ArrayList;

public class PathFinding {
    private static ArrayList<ArrayList<String>> routes = new ArrayList<ArrayList<String>>();
    private static String[] sourceArray      = {"Seattle", "LA",      "LA",    "Florida", "Seattle"};
    private static String[] destinationArray = {"LA",      "Florida", "Maine", "Seattle", "Florida"};

    public static void main(String rgs[])
    {
        find_routes("Seattle", "Maine", new ArrayList<String>());
        for(ArrayList<String> route : routes) {
            for(String node : route) {
                System.out.print(node + ", ");
            }
            System.out.println();
        }
    }

    private static void find_routes(String source, String destination, ArrayList<String> currentRoute) {
        // copy current route and add current node
        ArrayList<String> newRoute = new ArrayList<String>();
        newRoute.addAll(currentRoute);
        newRoute.add(source);
        // recursion anchor: source is destination, so route is finished and can be added to our routes
        if(source.equals(destination)) {
            routes.add(newRoute);
        } else {
            // check all possibilities for other routes
            for(int i = 0; i < sourceArray.length; ++i) {
                if(source.equals(sourceArray[i])) {
                    // if node is already in our route: cycle, i.e. no solution or no optimal solution
                    if(!currentRoute.contains(source)) {
                        find_routes(destinationArray[i], destination, newRoute);
                    }
                }
            }
        }
    }

}

这绝对不是最有效的方法,但它应该给你一个提示如何做到这一点。