2016-01-11 3 views
1

Я пытаюсь получить этот код работает как можно быстрее при прохождении через мой стек моего ДФС в настоящее время входные файлы следующим образом:Implemeting Стек обхода алгоритма DFS - Java

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** 
     } 

} 

Я смотрел на него некоторое время и не могу понять, почему именно данные разбора и используются. Ive изменил несколько вещей здесь и там, но были выброшены еще больше ошибок. Как бы то ни было, кто-то может помочь. Благодаря

EDIT: Я считаю, что проблема связана с попыткой использовать тип файла в виде строки я пометил в основном из DFS класса, где я считаю, что проблемы могут возникать

+0

У вас есть две версии: 'startDFSall' и' startDFSone'. С кем у вас проблемы? Ну, кроме 'startDFSone', проблема, которую вы никогда не называете' printPath() '. – Andreas

+0

Я вызываю printPath для целиNode в моей главной функции, хотя? – Ben411916

+0

Я продолжаю получать ошибку в своей основной функции в 'Maze maze = new Maze (файл);' но когда я изменяю его так же, как и в моем классе Maze, я получаю больше ошибок – Ben411916

ответ

1

Изменение

Maze maze = new Maze(file) 

в

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

Но программа все еще есть другие ошибки, которые будут исправлены. Eclipse, Netbean, intellij или некоторые другие IDE помогут вам.

+0

Буквально просто это сделало, когда ваш ответ появился :) Спасибо – Ben411916

 Смежные вопросы

  • Нет связанных вопросов^_^