数据结构与算法之走迷宫
2017-07-10 20:21
316 查看
1.走迷宫算法思想
走迷宫有很多种实现方式,包括:
(1)递归:
a.创建一个存储通路结点的栈Stack。
b.从矩阵的第一个结点(0,0)开始,将(0,0)结点压入栈中,顺时针从右->下->左->上寻找通路结点(这里我的设计是值为1的就是通路,值为0的就不是通路,这里的通路结点是要在通向目的结点那条道上的结点),将每个通路结点压入栈中,直到找到的通路结点是目的结点。
c.设置一个判断是否已经访问过的数组boolean visited[][],如果结点已经访问过,将数组中对应位置的值设置为true。
d.对于通路结点的选择,要判断是否在边界内,以及是否曾经压入栈中,也就是是否曾经访问过。
(2)深度优先搜索遍历
(3)广度优先搜索遍历
2.算法代码实现
3.效果展示
走迷宫有很多种实现方式,包括:
(1)递归:
a.创建一个存储通路结点的栈Stack。
b.从矩阵的第一个结点(0,0)开始,将(0,0)结点压入栈中,顺时针从右->下->左->上寻找通路结点(这里我的设计是值为1的就是通路,值为0的就不是通路,这里的通路结点是要在通向目的结点那条道上的结点),将每个通路结点压入栈中,直到找到的通路结点是目的结点。
c.设置一个判断是否已经访问过的数组boolean visited[][],如果结点已经访问过,将数组中对应位置的值设置为true。
d.对于通路结点的选择,要判断是否在边界内,以及是否曾经压入栈中,也就是是否曾经访问过。
(2)深度优先搜索遍历
(3)广度优先搜索遍历
2.算法代码实现
/** * @description 迷宫结点 * @author liuffei * @date 2017-07 */ public class MazeNode { private int row;//结点行数 private int col;//结点列数 public MazeNode(int row,int col){ this.row = row; this.col = col; } public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } }
import java.util.Stack; /** * @description 寻找迷宫的出路 * @author liuffei * @date 2017-06-16 */ public class MazeRoute { //创建存储路过结点的栈 public Stack<MazeNode> stack = new Stack<MazeNode>(); //maze中的结点为1表示是通路,0表示不是通路 public Stack findRoute(int[][] maze){ MazeNode beginNode = new MazeNode(0,0);//进入结点 stack.push(beginNode); //对于一个结点,从它的右-下-左-上顺时针进行遍历。判断当前节点的邻结点是否为通路,如果是的话,就压入栈中,继续寻找下一个通路。 int x = maze.length;//迷宫矩阵的行数 int y = maze[0].length;//迷宫矩阵的列数 int i = 0,j = 0;//i,j表示当前移动的位置 boolean visited[][] = new boolean[x][y];//标志结点是否有访问过 visited[0][0] = true; while(i < x - 1 || j < y - 1){ MazeNode nextNode = getNext(beginNode,maze,visited); if(nextNode.getRow() != beginNode.getRow() || nextNode.getCol() != beginNode.getCol()){ stack.push(nextNode); beginNode = nextNode; } i = nextNode.getRow(); j = nextNode.getCol(); } return stack; } //寻找当前结点的下一个通路 current表示当前结点 public MazeNode getNext(MazeNode current,int[][] maze,boolean visited[][]){ //表示下一个通路结点 MazeNode next = null; int x = maze.length;//迷宫矩阵的行数 int y = maze[0].length;//迷宫矩阵的列数 //当前结点current的上下左右结点中一定有一个结点是isWalk = true的。如果其他位置的三个结点都不是通路,则回到这个结点。 //current所在位置 int col = current.getCol(); int row= current.getRow(); //栈顶元素 MazeNode top = stack.peek(); //判断当前结点的右结点(row,col+1)是否是通路, if(col + 1 < y && maze[row][col+1] == 1 && !visited[row][col+1]){ next = new MazeNode(row,col+1); visited[row][col+1] = true; }else{ //如果右节点不是通路,寻找下结点 if(row + 1 < x && maze[row+1][col] == 1 && !visited[row+1][col]){ next = new MazeNode(row+1,col); visited[row+1][col] = true; }else{ //如果下节点不是通路,寻找左结点 if(col - 1 >= 0 && maze[row][col-1] == 1 && !visited[row][col-1]){ next = new MazeNode(row,col-1); visited[row][col-1] = true; }else{ //如果左结点不是通路,寻找上结点 if(row - 1 >= 0 && maze[row-1][col] == 1 && !visited[row-1][col]){ next = new MazeNode(row-1,col); visited[row-1][col] = true; }else{ //如果上结点都不是通路,就回到栈的栈顶位置。 next = top; } } } } return next; } }
import java.util.Stack; /** * 走迷宫算法测试 * @author liuffei * @date 2017年7月10日 * @description */ public class MazeMain { public static void main(String[] args) { int maze[][] = { {1,0,1,0,0,1,0}, {1,0,0,0,1,0,1}, {1,0,1,1,1,0,0}, {1,1,1,0,1,1,1}, {0,1,0,0,1,0,1}, {0,0,0,0,0,0,1} }; MazeRoute mazeRoute = new MazeRoute(); Stack stack = mazeRoute.findRoute(maze); while(!stack.isEmpty()){ MazeNode node = (MazeNode) stack.pop(); System.out.println("("+node.getRow()+","+node.getCol()+")"); } } }
3.效果展示
相关文章推荐
- 第六周--数据结构之自建算法库之迷宫问题(用队列)
- 算法:迷宫求解(栈的应用)-数据结构(8)
- 数据结构与算法-实验3-自定义栈,并实现走迷宫问题
- 第六周--数据结构之自建算法库之迷宫问题(用栈结构)
- 算法竞赛入门经典:第六章 数据结构基础 6.11迷宫
- 算法竞赛入门经典:第六章 数据结构基础 6.12迷宫路径
- 数据结构与算法学习之路:迷宫问题——回溯思想找出所有路径
- 数据结构与算法-----单向线性链表(逆转和反向打印)
- 数据结构经典算法(8)八皇后
- 数据结构实验之图论四:迷宫探索
- 数据结构与算法之大纲
- 数据结构及算法分析——(有序向量唯一化)笔记一
- 数据结构与算法笔记一
- 数据结构与算法入门
- 数据结构与算法——希尔排序
- 【3】数据结构与算法-3 冒泡排序算法
- [翻译]C#数据结构与算法 – 第五章栈与队列(Part 1)
- 【数据结构与算法】第三章 栈c实现,使用链表结构
- 数据结构算法之快速排序
- 数据结构与算法笔记 lesson 19 二叉树