`

数据结构应用回顾之Stack(二) 迷宫问题

 
阅读更多

 

迷宫问题,一般采用回溯法,利用stack节点探测,算法复杂度O(n^2),好像采用队列也可以实现,下片日志再使用队列试试。

 

package com.xx.dataStructure.stack;

enum Direction {
	east, south, west, north, nothing
}

class Position {
	int x;
	int y;
	boolean isInPath = false;
	Direction nextPosDirection;

	private Position(int x, int y, boolean isInPath, Direction nextPosDirection) {
		this.x = x;
		this.y = y;
		this.isInPath = isInPath;
		this.nextPosDirection = nextPosDirection;
	}

	private static Position[][] positions = new Position[11][11];

	static {
		for (int i = 1; i < positions.length; i++) {
			for (int j = 1; j < positions[i].length; j++) {
				positions[i][j] = new Position(i, j, false, Direction.east);
			}
		}
	}

	public static Position getPosition(int x, int y) {
		return positions[x][y];
	}

	public boolean isInPath() {
		return isInPath;
	}
	
	@Override
	public String toString(){
		return "("+x +"," + y + ")";
	}
}

// 迷宫求解
public class Strap {

	static Stack<Position> stack = new Stack<Position>(100);
	static {
		stack.init();
	}
	
	// true
	static int[][] strap2 = { { 1,1, 1,1 } ,
							  { 1,0, 0 ,1}, 
							  { 1,1, 0,1 } ,
							  { 1,1, 1,1 } 
							};
	// true
	static int[][] strap3 = { 
							{  1, 1, 1, 1, 1 }
							, {1, 0, 0, 0, 1 }
							, {1, 0, 1, 1, 1 }
							, {1, 0, 0, 0, 1 }
							, {1, 1, 1, 1, 1 }
							};
	// false
	static int[][] strap4 = { { 0, 1, 1 }, { 0, 0, 1 }, { 0, 1, 0 } };
	// true
	static int[][] strap10 = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
			{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1 },
			{ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1 },
			{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1 },
			{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 },
			{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1 },
			{ 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1 },
			{ 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 },
			{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1 },
			{ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1 },
			{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }

	};

	static Position getNextPosition(int[][] strap, Position p) {
		if (p.nextPosDirection == Direction.nothing)
			return null;
		if (p.nextPosDirection.compareTo(Direction.east) <= 0  && strap[p.x - 1][p.y] == 0 && 
				!Position.getPosition(p.x - 1,p.y).isInPath()) {
			p.nextPosDirection = Direction.south;
			return Position.getPosition(p.x - 1, p.y);
		} else if (p.nextPosDirection.compareTo(Direction.south) <= 0  && !Position.getPosition(p.x,p.y + 1).isInPath()
				&& strap[p.x][p.y + 1] == 0) {
			p.nextPosDirection = Direction.west;
			return Position.getPosition(p.x, p.y + 1);
		} else if (p.nextPosDirection.compareTo(Direction.west) <= 0  && !Position.getPosition(p.x + 1,p.y).isInPath()
				&& strap[p.x + 1][p.y] == 0) {
			p.nextPosDirection = Direction.north;
			return Position.getPosition(p.x + 1, p.y);
		} else if (p.nextPosDirection.compareTo(Direction.north) <= 0  && !Position.getPosition(p.x,p.y - 1).isInPath()
				&& strap[p.x][p.y - 1] == 0) {
			p.nextPosDirection = Direction.nothing;
			return Position.getPosition(p.x, p.y - 1);
		}
		return null;
	}

	static boolean isTrapCanSolution(int [][] strap,int n){
		//访问标记n*n阶数组 0 未在路径 1 在路径上
		if (n < 2 || strap.length < 4 || strap.length != n + 2)
			return false;
		if (strap[1][1] != 0 || strap[n][n] != 0){
			return false;
		}
		boolean result = false;
		
		stack.init();
		try {
			Position pos = Position.getPosition(1, 1);
			stack.push(pos);
			pos.isInPath = true;
			while(!stack.isEmpty()){
				Position p = stack.getTop();
				if (p == Position.getPosition(n, n)){
					result = true;
					break;
				}
				else {
					Position nextP = getNextPosition(strap,p);
					if (nextP == null){
						stack.pop();
						p.isInPath = false;
					}else {
						stack.push(nextP);
						nextP.isInPath = true;
						
					}
				}
			}
			if (stack.isEmpty() ){
				System.out.println("can not slove the strap problems; ");
			}
			else {
				stack.traverse();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}

	public static void main(String[] args) {
		isTrapCanSolution(strap10,10);
	}
}

 

 

分享到:
评论

相关推荐

    用栈的方式实现迷宫的路径求解

    本文将详细介绍如何利用栈这一数据结构来解决迷宫问题,即寻找从迷宫入口到出口的可行路径。 #### 二、基础知识回顾 1. **栈**:栈是一种只能在一端进行插入或删除操作的线性表,其操作遵循先进后出的原则。 2. **...

    Python 算法与数据结构

    本部分将教授读者如何用Python实现这些基本数据结构,并理解它们在解决实际问题中的应用。 4. 递归(Recursion) 递归是算法设计中非常重要的一个概念,教程中将介绍什么是递归(What is Recursion?)以及递归如何...

    数据结构与算法:C++描述

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    数据结构算法与应用-C__语言描述

    本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...

    python-data-structure-cn.pdf

    - 栈(Stack)是一种后进先出(LIFO)的数据结构,可以用于括号匹配、表达式求值等。 - 队列(Queue)是一种先进先出(FIFO)的数据结构,适用于模拟现实世界中的排队场景。 #### 2. 双端队列(Deque) - 双端队列...

    Problem Solving Algorithms and Data Structures

    本书《Problem Solving Algorithms and Data Structures》是关于数据结构与算法的入门书籍,旨在帮助读者理解并掌握解决计算机科学问题所必需的算法和数据结构的基础知识。书中代码示例采用Python语言编写,特点是...

    Algorithm_Study:알고리즘

    在C++中,你可以直接使用内置类型(如`std::vector`、`std::stack`、`std::queue`)或者自定义数据结构来实现这些概念。 2. **排序与搜索**:快速排序、归并排序、插入排序、选择排序、二分查找等都是常见的算法。...

    Learn C++ for Game Development

    - **后进先出(LIFO)**:学习`std::stack`的工作原理及其应用场景。 - **先进先出(FIFO)**:了解`std::queue`的特点及其在游戏中的用途。 18. **第18章:STL位集** - **位集**:介绍`std::bitset`的基本概念及其...

    高级语言C++程序设计

    - **7.4.2 利用stack类型解迷宫问题**:讲解了如何使用栈类型解决迷宫问题。 **7.5 类的静态成员及常量成员** - **7.5.1 类的静态成员**:介绍了类的静态成员变量和静态成员函数。 - **7.5.2 类的常量成员**:讲解...

Global site tag (gtag.js) - Google Analytics