深度优先搜索求解迷宫问题
2017-05-17 19:42
204 查看
1.问题描述
定义一个二维数组:
int maze[5][5] = {0,1, 0, 0, 0,
0,1,
0, 1, 0,
0,0,
0, 0, 0,
0,1,
1, 1, 0,
0,0,
0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。
2.代码
package cn.edu.hit; import java.util.Stack; /** * 用深度优先算法求解迷宫问题 * @author admin * */ public class Maze { //当然也可以用同样大的矩阵来标记没个走过的点,避免重复走回原来的路 private int m,n;//m和n是用来记录上一步的坐标,不能让下一步又走回去,这样永远走不完 public static Stack<int[]> s; public static void main(String[] args) { //声明迷宫,1表示不通,0表示通 int[][] maze = {{0,1,0,0,0},{0,1,0,1,0},{1,1,1,1,1},{0,1,1,1,0},{0,0,0,1,0}}; s = new Stack<int[]>();//用来存储路线 Maze m = new Maze(); if(m.out(0, 0, maze)){ for (int[] is : s) { System.out.println(is[0]+" "+is[1]); } System.out.println("走出去了"); }else{ System.out.println("走不出去"); } } public boolean out(int x,int y,int[][] array){ m = x; n = y; if(x==4 && y==4){ return true; } int[] a = new int[2]; //向下走 if(y+1<5 && array[x][y+1] == 0 && x != m && y+1 != n){ a[0] = x; a[1] = y+1; if (out(x, y+1, array)) { s.push(a); return true; }else{ s.pop(); array[x][y+1] = 1;//弹出去说明此路不通,直接标记为1 } } //向右走 if(x+1<5 && array[x+1][y] == 0 && x+1 != m && y != n){ a[0] = x+1; a[1] = y; if (out(x+1, y, array)) { s.push(a); return true; }else{ s.pop(); array[x+1][y] = 1;//弹出去说明此路不通,直接标记为1 } } if(y-1>-1 && array[x][y-1] == 0 && x != m && y-1 != n){ a[0] = x; a[1] = y-1; if (out(x, y-1, array)) { s.push(a); return true; }else{ s.pop(); array[x][y-1] = 1;//弹出去说明此路不通,直接标记为1 } } if(x-1>-1 && array[x-1][y] == 0 && x-1 != m && y != n){ a[0] = x-1; a[1] = y; if (out(x-1, y, array)) { s.push(a); return true; }else{ s.pop(); array[x-1][y] = 1;//弹出去说明此路不通,直接标记为1 } } return false; } }
相关文章推荐
- Java算法---华为oj迷宫问题求解(深度优先搜索)
- 深度优先搜索(DFS)求解迷宫问题
- 迷宫问题求解(C++非递归程序)
- 使用栈和队列求解迷宫问题(标准库)
- 数据结构学习之回溯法求解迷宫问题
- 递归求解迷宫问题
- 基于栈操作的迷宫问题求解
- 用回溯法链表求解迷宫问题
- 迷宫问题求解
- C语言用顺序栈求解迷宫问题
- 迷宫问题求解
- 广度优先搜索求解迷宫问题
- 用C语言实现迷宫求解问题
- 迷宫求解问题——堆栈的使用
- 迷宫问题的递归求解
- 栈实现迷宫求解问题
- 算法求解:MxN迷宫问题
- 利用递归来求解迷宫问题
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- algo3-4-3.c 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)