迷宫问题(最短路径BFS)


问题:

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。

小明只能向上下左右四个方向移动。

输入:

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。

每组输入的第一行是两个整数N和M(1<=N,M<=100)。

接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。

字符的含义如下:

‘S’:起点

‘E’:终点

‘-’:空地,可以通过

‘#’:障碍,无法通过

输入数据保证有且仅有一个起点和终点。

输出:

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

输入样例:

1

5 5

S-###

-----

##---

E#---

---##

代码:

#include <iostream>

#include <queue>

using namespace std;

typedef pair<int,int> p;

int book[100][100];

char lu[100][100];

int n,m;

int bfs(int x,int y){

    //最短路径

    queue<p> q;

    q.push(p(x,y));

    while(q.size()){

        p p1=q.front();

        q.pop();

        if(lu[p1.first][p1.second]=='E'){

            return book[p1.first][p1.second];

        }

        for(int i=-1;i<=1;i++){

            for(int j=-1;j<=1;j++){

                if(i==0&&j==0 || i==1&&j==1 || i==1&&j==-1 || i==-1&&j==1 || i==-1&&j==-1){

                    continue;

                }

                int i1=p1.first+i;

                int j1=p1.second+j;

                if(i1>=0&&i1<n&&j1>=0&&j1<m&&(lu[i1][j1]=='-'||lu[i1][j1]=='E')&&book[i1][j1]==999999){

                    book[i1][j1]=book[p1.first][p1.second]+1;

                    q.push(p(i1,j1));

                }

            }

        }

    }

    return 999999;

}

int main(){

    int sx,sy,k;

    cin>>k;

    while(1){

        if(k==0){

            break;

        }

        cin>>n>>m;

        int i,j;

        for(i=0;i<n;i++){

            for(j=0;j<m;j++){

              book[i][j]=999999;

              cin>>lu[i][j];

              if(lu[i][j]=='S'){

                    book[i][j]=0;

                    sx=i;

                    sy=j;

              }

            }

        }

        int res=bfs(sx,sy);

        if(res==999999){

            cout<<"-1"<<endl;

        }else{

            cout<<res<<endl;

        }

        k--;

    }

    return 0;

}

截图:


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容