问题:
在一个n*m的迷宫里,每一个坐标点有两种可能: 0 或 1。0表示该位置允许通过,1表示该位置不允许通过。从坐标(0,0)点出发,找出所有通往出口(n-1, m-1) 的路径。
如果我们用二维矩阵来表示,那么地图可以表示成:
0 0 0 0 0
1 0 1 0 1
0 0 0 01
0 1 0 0 0
0 0 0 1 0
在上面一个例子里,其中一条路径为0,0 -> 0,1 -> 0,2 -> 0,3 -> 1, 3 -> 2, 3 ->3, 3 -> 3, 4 -> 4,4
分析:
假设我们到了点 (i, j), 如果这个点不是 1, 那么,我们可以继续向右边走,即到点(i, j+1),也可以往下走,即到点 (i+1, j), 向左(i, j-1),向上(i -1, j)。对于这样每一个点,什么时候不再“前进”了呢?
1、这个点已经超出了矩阵的范围;
2、这个点值为 1;
3、这个点是终点。
4、这个点已经被遍历了。
如果这个点是终点,我们把路径上经历过的点都打印出来,所以,我们需要一个存储所有点的一个数据结构,这里,我们使用ArrayList.
PS.其实这个问题与打印一个二叉树所有路径的问题本质上是一模一样的(参考:http://blog.csdn.net/beiyeqingteng/article/details/7060642)。
实现代码如下:
public class Maze {
public void findPath(int[][] array, ArrayList<String> visited, int length2, ArrayList<Point> list, int length, int i, int j) {
//exit
if (i >= array.length || j >= array[0].length || i < 0 || j < 0 || array[i][j] == 1 || visited(visited, length2, i, j)== true) {
return;
}
//add the point to list
list.add(length, new Point(i, j));
++length;
visited.add(length2, i+","+j);
++length2;
//we find the exit, and print all the points on the path
if (i == array.length - 1 && j == array[0].length - 1) {
print(list, length);
}
// the right direction
findPath(array, visited, length2, list, length, i, j+1);
// the down direction
findPath(array, visited, length2, list, length, i+1, j);
// the left direction
findPath(array, visited, length2, list, length, i, j-1);
// the up direction
findPath(array, visited, length2, list, length, i-1, j);
}
// check whether the point has been visited or not
public boolean visited(ArrayList<String> visited, int length2, int i, int j) {
String point = i+","+j;
for (int k = 0; k < length2; k++) {
if (visited.get(k).equals(point)) return true;
}
return false;
}
public void print(ArrayList<Point> list, int length) {
for (int i = 0; i < length; i++) {
System.out.println(list.get(i).getX()+","+list.get(i).getY());
}
System.out.println("---------------------------");
}
public static void main(String[] args) {
int[][] array = {{0,0, 0}, {0,0, 0}};
Maze maze = new Maze();
ArrayList<Point> list = new ArrayList<Point>();
ArrayList<String> visited = new ArrayList<String>();
maze.findPath(array, visited, 0, list, 0, 0, 0);
}
}
class Point {
int x = 0;
int y = 0;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
扩展:
只找出所有路径里最短的一条?
答案:我们可以设置一个全局变量保存当前最短路径,只需要把所有可行的路径进行比较,我们就可以找到最短的路径。
转载请注明出处:blog.csdn.net/beiyeqingteng
分享到:
相关推荐
迷宫有一个入口,一个出口。一个人从入口走进迷宫,目标是找到出口。阴影部分和迷宫的外框为墙,每一步走一格,每格有四个可走的方向,...输出:若有解,输出从入口到出口的一条路径,否则输出 there is no solution!
对于给定迷宫(n*n),和一个起始坐标和终点坐标,设计一个回溯算法...若能打印路径,否则打印nopath! 输入文件示例: 输入: 4 00 33 。。。。 。。。。 x x x 。 。。。。 输出: 0 。。。 0 0 0 0 x x x 0 。。。x
谭浩强的那本C语言程序设计的关于迷宫的非递归方法的实现,方便学习
在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。 * 从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。
1.本演示程序中,首先实现一个以链表做存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标的方向。 2.演示程序以用户和计算机的...
0 and 1, respectively in the maze path and obstacles, to design a program, for any set of labyrinth, the path of a from inlet to outlet, or come to the conclusion that no pathway
/* ****迷宫算法求解************* */ /**计目标:教学演示**************/ ... static PosType start={1,1},end={8,8}; s=MazePath(start,end); if(s) printpath(s); else printf("\n NO find the path!"); }
请设计算法求解从迷宫入口位置(1,1)到迷宫出口位置(8,8)的所有通路,并以下列形式规范化程序输出: 迷宫中可通路径共n条 NO1:(1,1)—(a,b)—……—(8,8) NO2:(1,1)—(c,d)—……—...
例8.4迷宫问题 如图所示,给出一个n*m的迷宫图和一个入口、一个出口 编写一个程序,打印从一条从迷宫入口到出口的路径。这里黑色方块的单元表示走不通(用-1表示),白色表示可以走(用0表示) 只能往上、下、左、右...
查看和玩迷宫: ./laby.tcl -file <nom>玩家在可能的方向之一移动中央光标。 随着光标的每次移动,迷宫都会发生变化并建立新的路径。 游戏的目标是叠加3个绿点。 6种可能的运动如下: 1 2 3 \ | / \|/ /|\ / | \4 5...
virtualenv --no-site-packages env source env/bin/activate 视窗: virtualenv env . \e nv \S cripts \a ctivate 安装所需的软件包: pip install -r requirements.txt 用法 python grid.py 纽扣 迷宫/地形...
【问题描述】 在一个N*N的点阵中,如N=4,你现在站在(1,1),出口在(4,4)。你可以通过上、下、左、右四种移动方法,在迷宫内行走,但是同一个位置不可以访问两次,亦不可以越界。表格最上面的一行加黑数字A[1..4...
1215:迷宫 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 50593 通过数: 15724 【题目描述】 一天Extense在森林里探险的时候不小心走入了一个迷宫,...能办到则输出“YES”,否则输出“NO”。 【输入样例】 2 3 .##
最优化迷宫般的殖民地Proux的作品类型:在过程零件上的单位,在过程上零件上的迷宫。配置,编译复印机Make.inc.[gnu ou osx] Make.inc修改器ligne PROJECT_ROOT du fichier Make.inc nom l'indique,elle doit ...
将50只小鼠随机分成空白对照组、模型对照组、阳性对照组、香菇多糖低剂量组、香菇多糖高剂量组5个组,用Morris水迷宫检测小鼠学习记忆功能,微分电位溶出法测定血铅含量,硝酸还原酶法检测NO含量,免疫组化方法观察...
两部分,一个是 Dropwizard 服务,它连接到团队城市以解析它的迷宫 API 以获得损坏的构建。 另一个是一个糟糕的前端,它是用 angular 构建的,并在 node.js 中运行。 这样做的原因是,有人比我更有能力,可以为此...
粒子过滤器算法是贝叶斯过滤器的非参数实现,用于近似状态,例如在迷宫中移动的机器人。 这个想法是通过有限数量的随机变量(粒子)来表示后验信念。 该算法根据从测量模型得出的似然性对这些粒子重复进行重采样。 ...
例4:迷宫镜子问题 例5:防卫导弹问题 例6:剩余糖果问题 动态规划的基本概念 动态规划的基本思想 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的...
无名游戏是一款使用C ++和SDL编写的跨平台游戏。 玩家同时通过益智游戏,街机游戏和赛车游戏的功能在不同的迷宫中竞赛,同时彼此作战。
描述: 我们是NoName Bros,这是一个由少数学生组成的小团队,负责在CITM中获得游戏设计和开发的学士学位。 我们的目标是创造“分裂职责” ( Split Duty) ,这是一个基于回合的完全成熟的2D RPG游戏,玩家将被带去...