BFS简单迷宫

常见迷宫:

输入迷宫 启点 终点 然后求最短路径 BFS例题

用dist[][]数组来记录 启点到每个点的最短路径

 1 #include <iostream>
 2 #include <fstream>
 3 #include <stdio.h>
 4 #include <string.h>
 5 #include <queue>
 6 using namespace std;
 7
 8 const int maxsize = 128;
 9 const int INF = 0xfff3;
10 int m,n;
11 int d[2][4] = { {-1, 0, 1, 0}, {0, 1, 0, -1} };
12 int dist[maxsize][maxsize];//书上方法 : 用dist[m][n]将最短路径储存起来 初始为INF表示无法到达
13 struct Pos
14 {
15     int x,y;
16 }st,ed;
17 char maze[maxsize][maxsize];
18
19 bool check(int x, int y)
20 {
21     if(x < 0 || x >= m || y < 0 || y >= n) return false;
22     if(maze[x][y] == ‘#‘ || dist[x][y] != INF) return false;//!=INF表示可达就已经走到过
23     return true;
24 }
25 int bfs()
26 {
27     for (int i = 0; i < m; i++)
28       for (int j =0 ;j < n; j++)
29         dist[i][j] = INF;
30     queue<struct Pos> que;
31     que.push(st);
32     dist[st.x][st.y] = 0;//自己到自己为0
33     while (!que.empty())
34     {
35         int nx, ny;
36         Pos node = que.front();
37         que.pop();
38         //ans ++;//这里出错 并不是 每次出队都是最短路径中的结点 调试可以发现
39         if(node.x == ed.x && node.y == ed.y) return dist[ed.x][ed.y];
40         for (int i =0 ; i < 4; i++)
41         {
42             nx = node.x + d[0][i];
43             ny = node.y + d[1][i];
44             if (check(nx, ny))
45             {
46                 Pos temp;
47                 temp.x = nx;
48                 temp.y = ny;//这里用pair更好 方便
49                 dist[nx][ny] = dist[node.x][node.y] + 1;
50                 que.push(temp);
51             }
52         }
53     }
54     return -1;
55 }
56
57 int main()
58 {
59     ifstream cin("in.txt");
60     freopen("in.txt", "r", stdin);
61     scanf("%d%d", &m, &n);
62     getchar();
63     for (int i = 0;i < m; i++)
64     {
65         gets(maze[i]);
66     }
67     for (int i = 0; i < m; i++)
68     {
69         for (int j = 0; j < n; j++)
70         {
71             if (maze[i][j] == ‘S‘)
72             {
73                 st.x = i;
74                 st.y = j;
75             }
76             if (maze[i][j] == ‘G‘)
77             {
78                 ed.x = i;
79                 ed.y = j;
80             }
81         }
82     }
83     int ans = bfs();
84     if (ans == -1) cout << "no way" << endl;
85     else cout << ans << endl;
86 }
87 //对fill 和 memset 还需了解 是在不行就循环填充
88 //用dist记录最短路径 而不是每一次出队ans++
89 //时间复杂度 状态转移是四个方向 每个格至多访问一次 O(4*m*n)
时间: 2024-10-13 18:33:15

BFS简单迷宫的相关文章

BFS简单题套路_Codevs 1215 迷宫

BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 const int maxn = 20; struct Status { int r, c; Status(int r = 0, int c = 0) : r(r), c(c) {} // int DIR; }; int N; //迷宫数量 int W; //迷宫宽度 char map[maxn][maxn]; //地图 //方向 : 分别代表 上.右.下.左向量 int dir[4][2] = { {-1, 0

hdu1180诡异的楼梯……bfs走迷宫……wa了16次,我太渣了

#include<iostream> #include<queue> #include<cstring> using namespace std; int row,line,xx[4]={-1,1,0,0},yy[4]={0,0,-1,1}; char map[100][100]; bool vis[100][100]; struct node { int x,y,step; }st; void init() { int i,j; bool flag=1; for(i=

bfs简单应用----迷宫问题

[week2-A] 东东有一张地图,想通过地图找到妹纸.地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0.既然已经知道了地图,那么东 东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线. Input 输入是一个5 × 5的二维数组,仅由0.1两数字组成,表示法阵地图. Output 输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示.数据保证有唯一解. Sample Input 0 1 0 0 00 1 0 1 00 1 0

HDU 1253 胜利大逃亡 BFS 简单题

题意: Ignatius要从迷宫的(1,1,1)在时间t内跑到(a,b,c),问可不可能. (题目本来是从(0,0,0)跑到(a-1,b-1,c-1)的) 简单的3维bfs 加剪枝: a+b+c-3>t  速度会快不少. 不过我这里没有加. Input 输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后

BFS求解迷宫最短路径

本文使用BFS广度优先搜索算法实现求解迷宫的最短路径(C++),使用到了队列先进先出的性质,依次搜索路径直到找到目标出口(如果迷宫能走通)求解到的路径即为该迷宫的最短路径,找到返回true,找不到返回false,本文使用vexmap一个map容器记录队列的搜索路径(记录队列路径的实现有点草率,可以再优化).</p><p> </p><pre class="cpp" name="code">#include<iost

Sicily Maze(BFS计算迷宫最短路径)

      1000. Maze                       Time Limit: 1sec    Memory Limit:256MB Description Master Tang is kidnapped by a monster and put in a maze, and Mr. Sha wants to rescue him. The maze is an n*m matrix. There are two types rooms in the maze, 1 fo

HDU2102 A计划 BFS 简单题 有坑点 好题

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出.现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位置

用BFS解决迷宫问题

在一个n*n的矩阵里走,从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走,求最短步数.n*n是01矩阵,0代表该格子没有障碍,为1表示有障碍物. int mazeArr[maxn][maxn]; //表示的是01矩阵 int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4个方向 int visit[maxn][maxn]; //表示该点是否被访问过,防止回溯,回溯很耗时. 解题思路: BFS

C++使用回溯算法解决简单迷宫问题

给你一个矩阵,如何在其中找到一条通路呢? (是不是很凌乱?^_^) 在C++中怎么实现呢? 较好的解决方案:使用栈解决. 解决思路: 使用FILE*和open预先打开文件(绝对路径和相对路径1),注意断言. 正确读取文件,判断字符和空格,空格略过,读取字符. 从入口进入,每走一步,判断上下左右4个方向有无道路. 如果4个方向有路,则按次序先进入其中一条(将字符压栈push),并将所走过字符重置数字(后面回溯). 如果4个方向没有,则出栈pop,即回溯,并再次判断. 逐次循环,直至判断下一个有效节