zoukankan      html  css  js  c++  java
  • 研究和迷宫的实施

    【问题叙述性说明】

    随着M×N长期广场,迷宫。0和1分别迷宫的路径和障碍。设计一个程序,任意地设置迷宫,的通路,或得出没有通路的结论。
    (1)    依据二维数组,输出迷宫的图形。
    (2)    探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左。UP向上,输出从入口到出口的行走路径。

    【算法分析】

    主要考查数据结构-栈。栈作为一种数据结构,是一种仅仅能在一端进行插入和删除操作的特殊线性表。它依照先进后出的原则存储数据,先进入的数据被压入栈底。最后的数据在栈顶。须要读数据的时候从栈顶開始弹出数据(最后一个数据被第一个读出来)。

    栈具有记忆作用。对栈的插入与删除操作中,不须要改变栈底指针。

    具体请看百度百科: http://baike.baidu.com/subview/38877/12246229.htm?fr=aladdin

    【实现分析】

    可使用回溯方法,即从入口出发。顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回。换一个方向继续探索,直至出口位置。求得一条通路。假如全部可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

    【代码展示】

    1.首先创建一个Point类:

    package com.albertshao.study;
    
    public class Point {
    
    	private int x;
    
    	private int y;
    
    	public Point() {
    
    	}
    
    	public Point(int x, int y) {
    		this.x = x;
    		this.y = y;
    	}
    
    	@Override
    	public String toString() {
    		return "Point [x=" + x + ", y=" + y + "]";
    	}
    
    	public int getX() {
    		return x;
    	}
    
    	public void setX(int x) {
    		this.x = x;
    	}
    
    	public int getY() {
    		return y;
    	}
    
    	public void setY(int y) {
    		this.y = y;
    	}
    
    }
    
    迷宫类: 

    package com.albertshao.study;
    
    import java.util.Scanner;
    import java.util.Stack;
    
    public class Maze {
    
    	int maze[][];
    	private int row = 3;
    	private int col = 3;
    	Stack<Point> stack;
    	boolean p[][] = null;
    
    	public Maze() {
    
    		maze = new int[15][15];
    		stack = new Stack<Point>();
    		p = new boolean[15][15];
    	}
    
    	/*
    	 * construct the maze
    	 */
    	public void init() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("请输入迷宫的行数");
    		row = scanner.nextInt();
    		System.out.println("请输入迷宫的列数");
    		col = scanner.nextInt();
    		System.out.println("请输入" + row + "行" + col + "列的迷宫");
    		int temp = 0;
    		for (int i = 0; i < row; ++i) {
    			for (int j = 0; j < col; ++j) {
    				temp = scanner.nextInt();
    				maze[i][j] = temp;
    				p[i][j] = false;
    			}
    		}
    	}
    
    	/*
    	 * list, decide whether there is a road.
    	 */
    	public void findPath() {
    		
    		int temp[][] = new int[row + 2][col + 2];
    		for (int i = 0; i < row + 2; ++i) {
    			for (int j = 0; j < col + 2; ++j) {
    				temp[0][j] = 1;
    				temp[row + 1][j] = 1;
    				temp[i][0] = temp[i][col + 1] = 1;
    			}
    		}
    		
    		for(int i = 0; i < row + 2; i ++)
    		{
    			for(int j = 0; j < col + 2; j ++)
    			{
    				System.out.print(temp[i][j] + " ");
    				
    			}
    			System.out.println();
    		}
    		
    		// copy the original maze to the new temp.
    		for (int i = 0; i < row; ++i) {
    			for (int j = 0; j < col; ++j) {
    				temp[i + 1][j + 1] = maze[i][j];
    			}
    		}
    		
    		System.out.println("after copying data");
    		for(int i = 0; i < row + 2; i ++)
    		{
    			for(int j = 0; j < col + 2; j ++)
    			{
    				System.out.print(temp[i][j] + " ");
    				
    			}
    			System.out.println();
    		}
    		//from up-left to skip in the clockWise direction
    
    		int i = 1;
    		int j = 1;
    		p[i][j] = true;
    		stack.push(new Point(i, j));
    		while (!stack.empty() && (!(i == (row) && (j == col)))) {
    
    			if ((temp[i][j + 1] == 0) && (p[i][j + 1] == false)) { //turn right 
    				p[i][j + 1] = true;
    				stack.push(new Point(i, j + 1));
    				j++;
    			} else if ((temp[i + 1][j] == 0) && (p[i + 1][j] == false)) {  // turn down 
    				p[i + 1][j] = true;
    				stack.push(new Point(i + 1, j));
    				i++;
    			} else if ((temp[i][j - 1] == 0) && (p[i][j - 1] == false)) {  // turn left
    				p[i][j - 1] = true;
    				stack.push(new Point(i, j - 1));
    				j--;
    			} else if ((temp[i - 1][j] == 0) && (p[i - 1][j] == false)) { // turn up
    				p[i - 1][j] = true;
    				stack.push(new Point(i - 1, j));
    				i--;
    			} else {
    				stack.pop();
    				if (stack.empty()) {
    					break;
    				}
    				i = stack.peek().getX();
    				j = stack.peek().getY();
    			}
    
    		}
    
    		Stack<Point> newPos = new Stack<Point>();
    		if (stack.empty()) {
    			System.out.println("没有路径");
    		} else {
    			System.out.println("有路径");
    			System.out.println("路径例如以下:");
    			while (!stack.empty()) {
    				Point pos = new Point();
    				pos = stack.pop();
    				System.out.print("("+pos.getX() + "," + pos.getY()+") ");
    				newPos.push(pos);
    			}
    		}
    
    		/*
    		 * print the path
    		 */
    
    		String resault[][] = new String[row + 1][col + 1];
    		for (int k = 0; k < row; ++k) {
    			for (int t = 0; t < col; ++t) {
    				resault[k][t] = (maze[k][t]) + "";
    			}
    		}
    		while (!newPos.empty()) {
    			Point p1 = newPos.pop();
    			resault[p1.getX() - 1][p1.getY() - 1] = "#";
    
    		}
    
    		for (int k = 0; k < row; ++k) {
    			for (int t = 0; t < col; ++t) {
    				System.out.print(resault[k][t] + "	");
    			}
    			System.out.println();
    		}
    	}
    
    	
    	public static void main(String []args) 
    	{
    		Maze maze = new Maze();
    		maze.init();
    		maze.findPath();
    	}
    }
    

    測试结果:

    请输入迷宫的行数
    3
    请输入迷宫的列数
    3
    请输入3行3列的迷宫
    0 1 0
    0 0 1
    1 0 0 
    1 1 1 1 1 
    1 0 0 0 1 
    1 0 0 0 1 
    1 0 0 0 1 
    1 1 1 1 1 
    after copying data
    1 1 1 1 1 
    1 0 1 0 1 
    1 0 0 1 1 
    1 1 0 0 1 
    1 1 1 1 1 
    有路径
    路径例如以下:
    (3,3) 
    (3,2) 
    (2,2) 
    (2,1) 
    (1,1) 
    #	1	0	
    #	#	1	
    1	#	#	

    备注意:一些代码从朋友借来的。



    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    SQL之CASE WHEN用法详解
    MySQL笔记汇总
    Linux常用命令
    TCP/IP速记
    数据结构和算法速记
    多线程相关概念
    线程安全&Java内存模型
    线程通讯wait&notify
    创建多线程的4种方式
    重写ThreadPoolTaskExecutor
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4610106.html
Copyright © 2011-2022 走看看