博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题目1335:闯迷宫 BFS实现 和 递归实现。
阅读量:6071 次
发布时间:2019-06-20

本文共 2437 字,大约阅读时间需要 8 分钟。

转自:
还有另一题,类似的
建议用BFS实现较为方便。
 
题目描述:

sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。

sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。

输入:

输入有多组数据。

每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
注意:如果输入中的原点和终点为1则这个迷宫是不可达的。

输出:

对每组输入输出该迷宫的最短步数,若不能到达则输出-1。

样例输入:
20 10 050 0 0 0 01 0 1 0 10 0 0 0 00 1 1 1 01 0 1 0 0
样例输出:
28
 
郁闷啊,一做ACM的比赛题就认栽。总是通过一两个案例。不知道还有什么边界数据没考虑到。
自己测试的案例没有错。
一到ACM就挂了。只通过第一个案例。
哪位高手能指点一下??感激不尽!
 
经过初步分析:此类简单的迷宫问题是不适合用递归的。java会栈溢出,而且大数据会出错。暂时没发现问题在哪。根据打印结果,递归只是递归了地图的一大部分,而不是全部。
用BFS的话,是遍历了图中全部的节点。起初以为用递归会快些,后来发现还是用BFS比较好。
下面的代码仅供参考,是错误的。
import java.io.BufferedInputStream; import java.util.Arrays; import java.util.Scanner; public class 闯迷宫 {
static int arr[][]; static long opt[][]; static int n; static final long MAX = 99999999; static int ori[][] = {
{0,1},{0,-1},{1,0},{-1,0}}; public static void main(String[] args) {
Scanner s = new Scanner(new BufferedInputStream(System.in)); while(s.hasNextInt()){
n = s.nextInt(); arr = new int[n][n]; opt = new long[n][n]; for(long[] a:opt) Arrays.fill(a, MAX); for(int i=0; i
=0 && x
=0 && y
temp + 1) opt[i][j] = temp +1; } } return opt[i][j]; } } /*
测试:
6 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0
 

10

99999999 1 99999999 99999999 99999999 99999999
99999999 2 99999999 99999999 99999999 99999999
99999999 3 4 5 6 99999999
99999999 99999999 99999999 99999999 7 99999999
99999999 11 10 9 8 99999999
99999999 12 11 10 9 10

*/
 
 
正确的代码应该在下面,用BFS:
import java.io.BufferedInputStream; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main {
static int n; static int map[][]; static int visit[][]; static Queue q; static B start, end; static int ori[][] = {
{0,1},{0,-1},{1,0},{-1,0}}; public static void main(String[] args) {
Scanner s = new Scanner(new BufferedInputStream(System.in)); while(s.hasNextInt()){
n = s.nextInt(); map = new int[n][n]; visit = new int[n][n]; q = new LinkedList(); for(int i=0; i
=0 && x
=0 && y
 
 

转载于:https://www.cnblogs.com/love533/archive/2012/04/04/2431954.html

你可能感兴趣的文章
反射操作公共成员变量
查看>>
小孩的linux
查看>>
CSS3 transforms 3D翻开
查看>>
java基础---->正则表达式
查看>>
2.2013/06/13_log(n)+1
查看>>
关于加载iframe时进度条不消失的问题
查看>>
poj 3984迷宫问题【广搜】
查看>>
oracle ORA-01840:输入值对于日期格式不够长
查看>>
python基础知识~logger模块
查看>>
SIP入门(二):建立SIPserver
查看>>
Servlet3.0的异步
查看>>
WebService连接postgresql( 失败尝试)
查看>>
从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?...
查看>>
Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)
查看>>
从MFQ方法到需求分析
查看>>
android.view.WindowManager$BadTokenException: Unable to add window
查看>>
HDU5012:Dice(bfs模板)
查看>>
iphone openssh
查看>>
Linux下MEncoder的编译
查看>>
Xamarin使用ListView开启分组视图Cell数据展示bug处理
查看>>