1
我正在開發一個小程序來解決由DFS發佈的迷宮。但似乎算法在發現它的目標之前就停止了太早。任何人都可以給我一個暗示我做錯了什麼?迷宮路徑搜索DFS java
SO壁均爲1,3是目標,以及i標記用2
代碼的路徑:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Stack;
public class Maze {
private final int size;
private final int[][] maze;
Maze(int[][] maze){
this.size = maze.length;
this.maze = maze;
}
private boolean inBounds(int number){
return number >= 0 && number < this.size;
}
/*
* This one has no information where the end point is so it uses DFS to find a path to the
* the end point. The end point must be marked by a 3.
*
* procedure DFS-iterative(G,v):
* let S be a stack
* S.push(v)
* while S is not empty
* v = S.pop()
* if v is not labeled as discovered:
* label v as discovered
* for all edges from v to w in G.adjacentEdges(v) do
* S.push(w)
*
*
*/
public void solve(Node start){
Stack<Node> stack = new Stack<Node>();
HashSet<Node> visited = new HashSet<Node>();
stack.push(start);
while(!stack.isEmpty()){
Node tmp = stack.pop();
this.maze[tmp.getY()][tmp.getX()] = 2;
if(!visited.contains(tmp)){
visited.add(tmp);
for(Node n : this.getAdjacentEdges(tmp))
stack.push(n);
}
}
}
private List<Node> getAdjacentEdges(Node tmp) {
List<Node> neighbours = new ArrayList<Node>();
if(this.inBounds(tmp.getX()+1)){
if(this.maze[tmp.getY()][tmp.getX()+1] != 1){
neighbours.add(new Node(tmp.getX()+1, tmp.getY()));
}
}
if(this.inBounds(tmp.getX()-1)){
if(this.maze[tmp.getY()][tmp.getX()-1] != 1){
neighbours.add(new Node(tmp.getX()-1, tmp.getY()));
}
}
if(this.inBounds(tmp.getY()+1)){
if(this.maze[tmp.getY()+1][tmp.getX()] != 1){
neighbours.add(new Node(tmp.getX(), tmp.getY()+1));
}
}
if(this.inBounds(tmp.getY()-1)){
if(this.maze[tmp.getY()-1][tmp.getX()] != 1){
neighbours.add(new Node(tmp.getX(), tmp.getY()-1));
}
}
return neighbours;
}
public static void main(String args[]){
int [][] maze =
{ {1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,1,0,1,0,0,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1,0,1},
{1,0,0,0,1,1,1,0,0,0,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,0,0,1},
{1,0,1,0,1,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,1,3,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1}
};
Maze m = new Maze(maze);
m.solve(new Node(1,1));
for(int i = 0; i < maze.length; i++){
for(int j = 0; j < maze[i].length; j++){
System.out.print(" " + maze[i][j] + " ");
}
System.out.println();
}
}
}
節點類:
public class Node {
private int x;
private int y;
Node(int x, int y){
this.x = x;
this.y = y;
}
int getX(){
return this.x;
}
int getY(){
return this.y;
}
@Override
public int hashCode(){
return this.getX()+this.getY()+31;
}
@Override
public boolean equals(Object obj){
if (obj == this) return true;
if (obj == null || obj.getClass() != this.getClass()) return false;
Node tmp = (Node) obj;
return tmp.getX() == this.getX() && this.getY() == tmp.getY();
}
@Override
public String toString(){
return "x: " + this.getX() + " y: " + this.getY();
}
}
什麼是你節點類? –
我編輯了我的帖子。 – John