7-7 求解迷宫从入口到出口的路径 (15 分) java
求解迷宫从入口到出口的路径。输入一个迷宫,求从入口通向出口的可行路径。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,规定必须按向右、向下、向左、向上的顺序向前搜索试探。 如下这样一个迷宫:
对应的二维数组表示: int maze[10][10]={ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,1,1}, {1,0,0,0,1,0,0,0,1,1}, {1,0,1,0,0,0,1,0,0,1}, {1,1,1,1,0,1,1,0,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}};
输入格式:
输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)。
输出格式:
依次输出从入口到出口可行路径每个位置的行列下标(i,j),每个位置间用“,”分隔。若没有通路,输出:NO。
输入样例1:
4
1 1 1 1
1 0 1 1
1 0 0 1
1 1 1 1
结尾无空行
输出样例1:
(1,1)(2,1)(2,2)
结尾无空行
输入样例2:
10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
结尾无空行
输出样例2:
(1,1)(1,2)(2,2)(3,2)(3,1)(4,1)(5,1)(5,2)(5,3)(6,3)(6,4)(6,5)(7,5)(8,5)(8,6)(8,7)(8,8)
结尾无空行
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
// write your code here
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),i,j;
int mg[][]=new int[n][n];
Maze m=new Maze(n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
mg[i][j]=sc.nextInt();
}
}
m.create(mg);
if(m.mgth(1,1,n-2,n-2))
m.out();
else
System.out.println("NO");
}
}
class Box {
int i,j,k;
public Box(int i,int j,int k){
this.i=i;
this.j=j;
}
}
class Maze {
ArrayList<Box> arr=new ArrayList<Box>();
int n;
int mg[][];
public Maze(){}
public Maze(int n)
{
this.n=n;
mg=new int[n][n];
}
public void create(int a[][]){
int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
mg[i][j]=a[i][j];
}
}
public Boolean mgth(int xi,int yi,int xe,int ye)
{
int i=0,j=0,k = -1,i1=0,j1=0;
Box box,e;
boolean find;
Stack<Box> st=new Stack<Box>();
st.push(new Box(xi,yi,-1));
mg[xi][yi]=-1;
while(!st.empty()) {
k = -1;
box = st.peek();
i = box.i;
j = box.j;
k = box.k;
if (i == xe && j == ye) {
while (!st.empty()) {
e = st.pop();
arr.add(e);
}
return true;
}
find = false;
while (k < 3 && !find) {
k++;
if (k == 3){ i1 = i;
j1 = j - 1;}
else if (k == 0) {i1 = i - 1;
j1 = j;}
else if (k == 1){ i1 = i;
j1 = j + 1;}
else if (k == 2) {i1 = i + 1;
j1 = j;}
if (mg[i1][j1] == 0)
find = true;
}
if (find) {
e = st.pop();
e.k = k;
st.push(e);
st.push(new Box(i1, j1, -1));
mg[i1][j1] = -1;
} else {
mg[i][j] = 0;
st.pop();
}
}
return false;
}
public void out(){
int i=0;
for(i=arr.size()-1;i>=0;i--)
System.out.print("("+arr.get(i).i+","+arr.get(i).j+")");
}
}
7-7 求解迷宫从入口到出口的路径 (15 分) java相关推荐
- c语言迷宫游戏怎么存放坐标,求解迷宫问题(c语言,很详细哦
<求解迷宫问题(c语言,很详细哦>由会员分享,可在线阅读,更多相关<求解迷宫问题(c语言,很详细哦(5页珍藏版)>请在人人文库网上搜索. 1.求迷宫问题就是求出从入口到出口的路 ...
- 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)
// algo3-11.cpp 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径) #include"c1.h" #include"func3-1.cpp" ...
- A*算法求解迷宫问题(算法讲解与证明、python实现与可视化)
目录 一.引入 二.具体细节 1.BFS(Breadth First Search) 2.Dijkstra(Uniform Cost Search) 3.启发式(Heuristic search) 4 ...
- 栈和队列求解迷宫问题(数据结构学习笔记)
文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...
- 【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码
问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界 ...
- 递归 求解迷宫问题 Java
目录 题目描述: 解题思路: 代码分析: 题目描述: 如图所示有一个 3X4 的迷宫,其中黑色方框代表墙,白色方框代表可通行,指定迷宫的入口和出口,计算出入口到出口的路径 解题思路: 1.先将迷宫地图 ...
- python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序
目的:能将栈运用的更为熟练 实验内容:求解迷宫问题程序,要求输出如图所示的迷宫的路径,并求出第一条最短路径的长度以及最短路径. 设计的算法功能: mgpath(int xi,int yi,int xe ...
- [数据结构]求解迷宫最短路径问题
一.问题概述 之前,我们了解了如何实现迷宫问题(对于迷宫只有一个出口可以通的情况),事实上我们的迷宫有多个出口,对于每条路径来说,有长有短,所以在这里,我们讨论一下迷宫的最短路径,即迷宫路径的最优解问 ...
- java 递归_采用递归算法求解迷宫问题(Java版) | 附代码+视频
递归算法能够解决很多计算机科学问题,迷宫问题就是其中一个典型案例.本篇教程我们将采用递归算法求解迷宫问题,输出从入口到出口的所有迷宫路径. 01 用递归算法解决迷宫问题 迷宫问题在<数据结构教程 ...
最新文章
- C语言再学习 -- 字符串和字符串函数
- Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机
- 牛客题霸 [ 寻找峰值] C++题解/答案
- Google App Engine JAX-RS REST服务
- 线性表—顺序存储结构-顺序表
- mysql优化-面试题
- 为什么你的支付宝芝麻信用分就是不涨?
- 看懂理解 keyboard中 , navigation的设置: 切换工作区和移动窗口到不同的工作区.
- Runtime.getRuntime().exec()如何调用7z解压文件
- 6.Nginx静态代理
- win7系统激活最简单方法
- canvas 之 炫彩小球
- codevs 1296
- java queue toarray_Java PriorityBlockingQueue toArray()用法及代码示例
- docker oxidized时区问题,时间显示不是北京时间问题的解决办法
- linux 清屏命令(clear,reset)
- caj怎么转pdf?
- 什么是数据描述统计分析指标?
- CSDN 软件开发新手赛正式启动,召集热爱编程的你
- 转换MP3工具(Streambox RipperRM)
热门文章
- 【mpeg】mpeg1、mpeg2与mpeg4码流结构区别分析
- 微信小程序开发之——附近酒店-分析(1)
- 软件设计模式六大原则
- 使用EMU8086学习汇编
- Map的有序和无序实现类,与Map的排序
- 从月薪 7.5K 再到拿到字节跳动 20K*14 薪那天,我泪目了,没人知道我付出了多少
- 查找算法——顺序查找
- android 删除短信 数据库,删除的短信如何恢复?Android手机短信删除了怎么恢复...
- JavaScript获得页面卷起的高度
- Shell脚本,循环语句用于减少程序代码冗余和重复,for语句,while语句,使用let进行变量自增