bfs:求最短路径的长度

*/-->

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

bfs:求最短路径的长度

题目:迷宫的最短路径
给定一个大小为N x M的迷宫。迷宫由通道和墙壁组成。每一步可以向邻接的上下左右四格的通道
移动。请求出从起点到终点所需的最小步数

#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
.#######.#
....#.....
.####.###.
....#...G#
输出 22
#include <cstdio>
#include <queue>

using namespace std;

const int inf = 0x3fffffff;
const int maxn = 105;

char g[maxn][maxn];
int sx, sy;
int gx, gy;
int n;
int m;
int d[maxn][maxn];

int bfs() {
    queue<pair<int, int> > que;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            d[i][j] = inf;
        }
    }

    que.push(make_pair(sx, sy));
    d[sx][sy] = 0;

    while (que.size()) {
        pair<int, int> p = que.front();
        que.pop();

        if (p.first == gx && p.second == gy) {
            break;
        }

        int dx[4] = { 1, 0, -1, 0 };
        int dy[4] = { 0, 1, 0, -1 };

        for (int i = 0; i < 4; i++) {
            int nx = p.first + dx[i];
            int ny = p.second + dy[i];
            if (0 <= nx && nx < n && 0 <= ny && ny < m && g[nx][ny] != ‘#‘ && d[nx][ny] == inf) {
                que.push(make_pair(nx, ny));
                d[nx][ny] = d[p.first][p.second] + 1;
            }
        }
    }
    return d[gx][gy];
}

void solve() {
    int res = bfs();
    printf("%d\n", res);
}

int main(void) {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%c", &g[i][j]); // 如果超时可以考虑用 scanf("%s", g[i]);
            if (g[i][j] == ‘S‘) {
                sx = i;
                sy = j;
            } else if (g[i][j] == ‘G‘) {
                gx = i;
                gy = j;
            }
        }
        getchar();
    }
    solve();

    return 0;
}
时间: 2024-10-13 11:57:12

bfs:求最短路径的长度的相关文章

UVa 1599 理想路径(反向BFS 求最短路径 )

题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数, 如果最少步数相同有多条路径, 那么输出权值字典序最小的一条. 分析: 用BFS解决最短路问题, 可以先从终点BFS, 求出每个点到终点的最短距离. 那么最少步数就是起点的最短距离, 最短路径就是从起点每次向最短距离比自己少1的顶点移动(如果有多个则可以随便走), 这样就可以保证走的是最短路径, 如果一开始

bfs求最短路径

好久没写搜索,到忘了,找了半个小时错误. 一开始又把题看错了,真服自己了.(认真审题) 这题可以用excel写.but作为一个程序园,那就要使用灵魂操作. 核心算法:bfs层次遍历 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 string s[35]; 5 int vist[35][55];//标记 6 int disx[4] = {0, 0, -1, 1}; 7 int disy[4] = {1, -1, 0, 0}; 8 in

Catch That Cow BFS求线性双向最短路径

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是相连通的.(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住. /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */ #include <cstdio> #i

Dijkstra求最短路径

单源点的最短路径问题:给定带权有向图G和源点V,求从V到G中其余各顶点的最短路径 Dijkstra算法描述如下: (1)用带权的邻接矩阵arcs表示有向图,arcs[i][j]表示弧<vi,vj>上的权值,若<vi,vj>不存在,则置arcs[i][j]=INF. vis为已找到从v出发的最短路径的终点集合,它的初始状态为空集.那么,从v出发到图上其余各顶点可能到达的最短路径初值为: D[i]=arcs[Vex(G,v)][i],vi属于V (2)选择vj,使得D[j]=Min{D

POJ 3026 Borg Maze(Prim+bfs求各点间距离)

题目链接:http://poj.org/problem?id=3026 题目大意:在一个y行 x列的迷宫中,有可行走的通路空格’  ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母,输出这条路径L的总长度. 解题思路:相当于所有的字母A和S都是结点,求连接这些结点的最小距离和,是最小生成树的题目.先用BFS求各点间的距离,然后再用Prim(Kruskal也可以)求出最小距离就可以了. 注意:输完行列m和n之后,后面有一堆空格,要用gets()去掉,题目

UVA 816 -- Abbott&#39;s Revenge(BFS求最短路)

 UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉点的方向(用NEWS表示不同方向)不同时, 允许出去的方向也不相同. 例如:1 2 WLF NR ER * 表示如果 进去时朝W(左), 可以 左转(L)或直行(F), 如果 朝N只能右转(R) 如果朝E也只能右转.* 表示这个点的描述结束啦! 输入有: 起点的坐标, 朝向, 终点的坐标.然后是各个

Codeforces1294F. Three Paths on a Tree(两次BFS求树的直径)

题意: 给一棵树,找到三个顶点,使三个顶点两两之间路径的并集最大 思路: 必定会有一组最优解,使得 a,b是树直径上的端点. 证明: 假设某个答案取连接点x.x最远的树到达的点是s,根据树的直径算法,s是树的某个直径a的端点.假设x的最远和第二远的点组成的链是b,b就会和a有一段公共部分.我们取a和b相交部分距离s最远的那个点y.那么取这个链上点y的答案一定比x更优 用两次BFS可以求出直径的两个端点,在这个过程中还能顺便求出一个端点到树上每一点的距离.之后再用一次BFS求得另一个端点到树上每一

poj 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14653   Accepted: 6965 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the