白皮书P34-迷宫的最短路径

不羁的心 提交于 2019-12-04 23:44:38

题目描述:

 

 样例:

 

 

题解:

  这道题是典型的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;
}

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!