迷宫问题(最短路径BFS)


问题:

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

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

输入:

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

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

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

字符的含义如下:

‘S’:起点

‘E’:终点

‘-’:空地,可以通过

‘#’:障碍,无法通过

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

输出:

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

输入样例:

1

5 5

S-###

-----

##---

E#---

---##

代码:

#include

#include

using namespace std;

typedef pair p;

int book[100][100];

char lu[100][100];

int n,m;

int bfs(int x,int y){

    //最短路径

    queue

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=0&&j1

                    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

            for(j=0;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"<

        }else{

            cout<

        }

        k--;

    }

    return 0;

}

截图:


你可能感兴趣的:(迷宫问题(最短路径BFS))