实现DFS算法的堆栈遍历-Java



当我遍历我的DFS堆栈时,我正试图让这段代码尽可能快地运行。当前输入文件如下:

0 2
2 1
1 4
4 5
5 6
10 8
8 9
9 6
7 6
3 4
0 1
3 9
0 4

其中我的Maze类将数字联系在一起,并为我创建一个图。创建图后,我的DFS类将遍历,为提交的.txt文件提供一个或所有解决方案。我最近修改了我的Maze类,以便它能更有效地运行,但却出现了错误,数据正在解析到我的DFS以输出。我的Maze类如下:

import java.io.*;
import java.util.*;
public class Maze {
    private final Map<Integer, Set<Integer>> adjList = new HashMap<>();
    /**
     * The main constructor that takes a String for reading maze file.
     *
     * @param file
     */
    public Maze(File file) throws FileNotFoundException {
        try (Scanner scan = new Scanner(file)) {
            while (scan.hasNextInt()) {
                int node1 = scan.nextInt();
                int node2 = scan.nextInt();
                this.connect(node1, node2);
                this.connect(node2, node1);
            }
        }
    }
    /**
     * Makes a unidirectional connection from node1 to node2.
     */
    private void connect(int node1, int node2) {
        if (!this.adjList.containsKey(node1)) {
            this.adjList.put(node1, new HashSet<Integer>());
        }
        this.adjList.get(node1).add(node2);
    }
    /**
     * Returns a human-readable description of the adjacency lists.
     */
    public String toString() {
        StringBuilder s = new StringBuilder();
        for (Map.Entry<Integer, Set<Integer>> adj : this.adjList.entrySet()) {
            int from = adj.getKey();
            Set<Integer> to = adj.getValue();
            s.append(from).append(" connected to ").append(to).append('n');
        }
        return s.toString();
    }
    /**
     * Returns the set of nodes connected to a particular node.
     *
     * @param node - the node whose neighbors should be fetched
     */
    public Iterable<Integer> getadjList(int node) {
        return Collections.unmodifiableSet(adjList.get(node));
    }
    /**
     * Demonstration of file reading.
     */
    public static void main(String[] args) throws FileNotFoundException {
        System.err.print("Enter File: ");
        Scanner scanFile = new Scanner(System.in);
        String file = scanFile.nextLine();
        Maze m = new Maze(new File(file));
        System.out.println(m);
    }
}

我的DFS看起来是这样的。

import java.util.Scanner;
import java.util.Stack;
public class DFS {
    //starting node, the route to the next node, has node been visited
    private int startNode; 
    private int[] route;
    private boolean[] visited;

    // 2 main arguments - Maze File & user input
    public DFS(Maze maze, int inputInt) {
        int startNode = 0;
        int goalNode = 1;
        route = new int[maze.node];
        visited = new boolean[maze.node];
        //Takes user's input and runs desired function
        if(inputInt == 1){
        startDFSone(maze, startNode, goalNode);
        }
        else if (inputInt == 2){
        startDFSall(maze, startNode, goalNode);
        }
        else {
            System.out.println("input invalid. No Solution Returned");
        }
    }

    //Put path to goal in the stack
    public Stack<Integer> route(int toGoalNode) {
        if (!visited[toGoalNode]) {
            return null;
        }
        Stack<Integer> pathStack = new Stack<Integer>();
        for (int routeGoalNode = toGoalNode; routeGoalNode != startNode; routeGoalNode = route[routeGoalNode]) {
            pathStack.push(routeGoalNode);
        }
        pathStack.push(startNode);
        reverseStack(pathStack);
        return pathStack;
    }
    //Reverse the stack
    public void reverseStack(Stack<Integer> stackToBeReverse) {
        if (stackToBeReverse.isEmpty()) {
            return;
        }
        int bottom = popBottomStack(stackToBeReverse);
        reverseStack(stackToBeReverse);
        stackToBeReverse.push(bottom);
    }
    //Pop the bottom of the stack
    private int popBottomStack(Stack<Integer> stackToBeReverse) {
        int popTopStack = stackToBeReverse.pop();
        if (stackToBeReverse.isEmpty()) {
            return popTopStack;
        } else {
            int bottomStack = popBottomStack(stackToBeReverse);
            stackToBeReverse.push(popTopStack);
            return bottomStack;
        }
    }
    //performs DFS and unsets visited to give the result of all paths 
    private void startDFSall(Maze maze, int node, int goal) {
        visited[node] = true; 
        if(node == goal) { 
            printPath(goal);
        } else {
            for (int con : maze.getadjList(node)) {
                if (!visited[con]) {
                    route[con] = node;
                    startDFSall(maze, con, goal);
                }
            }
        }
        visited[node] = false; 
    }
  //performs DFS and maintains visited marker giving only one path
    private void startDFSone(Maze maze, int node, int goal) {
            visited[node] = true;
            for (int con : maze.getadjList(node)) {
                if (!visited[con]) {
                    route[con] = node;
                    startDFSone(maze, con, goal);
                }
            }
        }
    //Traverse the connections to the goal and print the path taken
    public void printPath( int toGoal) {
        int goalNode = 1;
        if (visited[toGoal]) {
            System.out.println("Completed Path: ");
            for (int t : route(toGoal)) {
                if (t == toGoal) {
                    System.out.print(t);
                } else {
                    System.out.print(t + " -> ");
                }
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner scanFile = new Scanner(System.in);
        int goalNode = 1;
        System.out.print("Enter maze file: ");
        String file = scanFile.nextLine();
        Maze maze = new Maze(file); //**Most error's show here**
        Scanner scanInt = new Scanner(System.in);
        System.out.print("Enter desired feedback (1 = one soultion, 2 = all): ");
        int inputInt = scanInt.nextInt();
        maze.toString(); //**Most error's show here**
        System.out.println();           
        DFS dfs = new DFS(maze, inputInt); //**error's show here**
        dfs.printPath(goalNode); //**error's show here**
        }
}

我已经看了一段时间了,不知道为什么要解析和使用数据。我在这里和那里修改了一些东西,但被抛出了更多的错误。无论如何,希望有人能帮忙。感谢

编辑:我认为问题是由于试图将File类型用作我在DFS类的main中标记的String,我认为问题可能源于

更改

Maze maze = new Maze(file)

进入

Maze maze = new Maze(new File(file));

但该程序仍有其他错误需要修复。Eclipse、Netbean、intellij或其他一些IDE会对您有所帮助。

最新更新