zoukankan      html  css  js  c++  java
  • 白皮书P34-迷宫的最短路径

    题目描述:

     样例:

    题解:

      这道题是典型的BFS题型,记录下一跳所有方向的数量,选择是进入下一步还是原地踏步,来进行步数的更新。当然,也可以开一个数组,利用前驱+1来记录每一个坐标到出发点点的最短距离。

      除此之外,开一个数组不断记录前驱,可以找到终点到起点的路径。

    代码:

    #include <iostream>
    #include <queue>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    int const N = 105;
    char mp[N][N];
    
    int minstep = 10005;
    int tt[N];
    
    struct Dian{
        int x,y;
    };
    
    queue<Dian> q;
    
    Dian d[N][N];
    
    Dian start;
    void bfs(int step){
        Dian s;
    
        if(!q.empty()){
            s = q.front();
            q.pop();
        }else{
            return;
        }
    
        if(mp[s.x][s.y] == 'G'){
            if(step < minstep){
                minstep = step;
            }
            return;
        }
        mp[s.x][s.y] = '#';
        Dian tmp;
        if(mp[s.x-1][s.y] == '.' || mp[s.x-1][s.y] == 'G'){
            tmp.x = s.x-1;
            tmp.y = s.y;
            d[tmp.x][tmp.y] = s;
            q.push(tmp);
            tt[step+1]++;
        }
        if(mp[s.x][s.y-1] == '.' || mp[s.x][s.y-1] == 'G'){
            tmp.x = s.x;
            tmp.y = s.y-1;
            d[tmp.x][tmp.y] = s;
            q.push(tmp);
            tt[step+1]++;
        }
        if(mp[s.x+1][s.y] == '.' || mp[s.x+1][s.y] == 'G'){
            tmp.x = s.x+1;
            tmp.y = s.y;
            d[tmp.x][tmp.y] = s;
            q.push(tmp);
            tt[step+1]++;
        }
        if(mp[s.x][s.y+1] == '.' || mp[s.x][s.y+1] == 'G'){
            tmp.x = s.x;
            tmp.y = s.y+1;
            d[tmp.x][tmp.y] = s;
            q.push(tmp);
            tt[step+1]++;
        }
        tt[step]--;
        if(tt[step] <= 0){
            bfs(step+1);
        }else{
            bfs(step);
        }
    }
    
    void showit(int x,int y){
        if(x == start.x && y == start.y){
            return;
        }
        Dian tmp = d[x][y];
    
        showit(tmp.x,tmp.y);
        cout << "(" << x << "," << y << ")" << endl;
    
    }
    
    
    int main() {
        int n,m;
        int endx,endy;
        cin >> n >> m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin >> mp[i][j];
                if(mp[i][j] == 'S'){
                    start.x = i;
                    start.y = j;
                }
                if(mp[i][j] == 'G'){
                    endx = i;
                    endy = j;
                }
            }
        }
        q.push(start);
        bfs(0);
        cout << minstep << endl;
        showit(endx,endy);
        return 0;
    }
  • 相关阅读:
    (转)值得学习百度开源70+项目
    C#中$的用法
    (转载)《C#高级编程》读书笔记
    C#调用大漠插件
    Visual Studio 2017 扩展推荐
    C#操作Dataset数据集与SQLite数据库
    (转载)C#格式规范
    (转载)DataTable与List<T>相互转换
    FastReport.Net
    (转载)C #开源框架
  • 原文地址:https://www.cnblogs.com/doubest/p/11888732.html
Copyright © 2011-2022 走看看