迷宫问题(bfs)

 1 import java.util.LinkedList;
 2 import java.util.Queue;
 3 import java.util.Stack;
 4
 5 public class BFS
 6 {
 7     private static final int M=3;//代表行
 8     private static final int N=3;//代表列
 9
10     int destX=1;
11     int destY=0;
12
13     //int[][] maze={{0,0,1,1},{0,0,0,1},{1,1,0,1},{0,0,0,0}};//迷宫布局,1表示障碍物
14     int[][] maze={{0,0,0},{0,1,0},{0,0,0}};//迷宫布局,1表示障碍物
15     int[][] visit=new int[M][N];//标记是否已经访问过
16     int[][] stepArr={{-1,0},{1,0},{0,-1},{0,1}};//表示走路的方向:上下左右
17
18
19
20     class Node
21     {
22         int x,y;//表示当前位置的坐标
23         int step;
24         int preX,preY;
25
26         Node(int x,int y,int preX,int preY,int step)
27         {
28             this.x=x;//表示当前位置的横坐标
29             this.y=y;//表示当前位置的纵坐标
30             this.preX=preX;//表示当前位置前一步的横坐标
31             this.preY=preY;//表示当前位置前一步的纵坐标
32             this.step=step;//表示行走的路程
33         }
34     }
35
36     public boolean bfs()
37     {
38         Node node=new Node(0,0,-1,-1,0);//起始位置
39         Queue<Node> queue=new LinkedList<Node>();//LinkedList类实现了Queue接口
40         Stack<Node> stack=new Stack<Node>();
41
42         queue.offer(node);//插入node
43
44         while(!queue.isEmpty())
45         {
46             Node head=queue.poll();//推出队列头
47
48             stack.push(head); //用于保存路径
49             visit[head.x][head.y] = 1;  //表示当前位置已被访问,防止两个坐标循环访问
50             for(int i = 0; i < 4; i++){  //这里的4表示4张方向
51                 int x = head.x + stepArr[i][0];
52                 int y = head.y + stepArr[i][1];
53                 //exit
54                 if(x ==destX && y == destY && maze[x][y] == 0 && visit[x][y] == 0){ //表示找到目的地
55                     //打印路径
56                     Node top = stack.pop();
57                     System.out.println("steps:" + (top.step + 1)); //此处得出的路径是最短路径,因为是queue中保存了每一种可能
58                     System.out.println("the path:");
59                     System.out.println((M - 1) + "," + (N - 1));
60                     System.out.println(top.x + "," + top.y);
61                     int preX = top.preX;
62                     int preY = top.preY;
63                     while(!stack.isEmpty()){
64                         top = stack.pop();
65                         if (preX == top.x && preY == top.y) { // 因为队列中保存了每一次的各种可能,故需要与之前保存的点进行验证
66                             System.out.println(preX + "," + preY);
67                             preX = top.preX;
68                             preY = top.preY;
69                         }
70
71                     }
72                     return true;
73                 }
74                 //bfs
75                 if(x >= 0 && x < M && y >= 0 && y < N &&maze[x][y] == 0 && visit[x][y] == 0){
76                     Node newNode = new Node(x, y, head.x, head.y, head.step + 1);
77                     queue.offer(newNode);
78                 }
79             }
80
81         }
82         return false;
83     }
84
85
86     public static void main(String[] args)
87     {
88         BFS b=new BFS();
89         if (b.bfs()==false)
90         {
91             System.out.println("Fail!");
92         }
93     }
94
95
96
97
98 }

利用bfs可求出迷宫的最短路径。

如果使用dfs的话只能判断能否走出迷宫,并不能知道所走路径是否为最短路径。

时间: 2024-10-13 02:00:29

迷宫问题(bfs)的相关文章

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU 1728 逃离迷宫(BFS)

Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可

迷宫问题 BFS入门水题

1102:迷宫问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:84 解决: 41 题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行是两个整数N和M(1<=N,M<=100). 接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格. 字符的含义如下: 'S':起点 'E':终点 '-':空地,可以通过 '#':障碍,无法通

hdu 1728 逃离迷宫 (bfs+循环队列)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15248    Accepted Submission(s): 3681 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using

学霸的迷宫(BFS+记录路径)

1 //求从(sx.sy)到(gx.gy)的最短距离; 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstdio> 6 #include<queue> 7 #include<cstring> 8 #define INF 99999999 9 10 using namespace std; 11 12 typedef pair<int, int > P; //数对,记录位置

迷宫问题(bfs的应用)

问题描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线.入口点为[0,0],既第一空格是可以走的路. Input 一个

HDU1728 逃离迷宫【BFS】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目大意: 有一个M*N的矩阵迷宫.其中,字符'.'表示此处为空地,字符'*'表示此处为障碍.在迷宫中,只能向 相邻的上.下.左.右方向走.而且在走的时候,转弯最多不能超过k次.给你初始位置(x1,y1),终 止位置(x2,y2),问:是否能从初始位置走到终止位置. 思路: 建立一个结构体,结构体中(x,y)表示当前位置,t表示目前的转弯次数.搜索四个方向,并记录下转弯 数,如果转弯数大于或

POJ 3984 迷宫问题 bfs

题目链接:迷宫问题 天啦撸.最近怎么了.小bug缠身,大bug 不断.然这是我大腿第一次给我dbug.虽然最后的结果是.我............bfs入队列的是now.............. 然后.保存路径的一种用的string .一种用的数组.大同小异.根据就是我bfs 先搜到的绝壁就是步数最少的. 附代码: pre 数组 1 /* 2 很简单的广搜.如果不是+路径输出的话.. 3 保存路径. 4 */ 5 6 #include <stdio.h> 7 #include <str

简单的迷宫(bfs)noj1793

题目描述 睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么… 不管那么多了,还是先离开为妙.不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么? 这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M).除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点. 输入 组数据输入. 每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2, 接下来k行,每行