题目:东东找妹纸。

东东手里有一张神奇的地图,通过地图可以找到妹子!地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。

输入输出要求及样例见下图:

bfs之走地图(迷宫)

bfs之走地图(迷宫)

 

思路:

这是一个需要求解最短路径的问题,考虑使用广度优先搜索配合队列,广度优先搜索是一层一层进行搜索的,一步能到达的点这个方法就不会让你走两步到达(因为在第一层搜索的时候已经把点加入队列了)。由于结果是要求整个路径而不是最小距离,因此在进行bfs时需要记录每一点的上一个位置。

流程如下:

首先将起点加入队列中;

开始循环依次处理队列中的每一个点,处理方法为找到该点相邻的且未被标记的点(用vis数组记录标记信息)加入队列,在处理相邻点的时候使用偏移量dx、dy,由于题目要求路径,因此在讲每个点加入队列的同时记录前一个点在road数组中;

直到终点被标记,整个广度优先搜索过程结束;

因为找到路径时是从终点向起点回溯的,因此找寻出来的路径正常来讲是反序的。这个正序输出的方法相当暴力,没有采取递归的方法。而是从终点开始,找到终点的前一个点a,然后再找点a的前一个点,循环该过程,直至回到起点。在此过程中,将点信息反序保存在了一位数组output中,然后再正序输出,就输出了寻找妹纸的路径。

 

代码:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int maze[5][5];//迷宫
int dis[5][5];//距离 
pair<int,int> road[5][5];//路径
bool vis[5][5];
pair<int,int> output[25];

queue<pair<int,int> >  q;

const int dx[4] = {0,0,-1,1};//上下左右
const int dy[4] = {1,-1,0,0};//上下左右

void bfs()
{
    memset(vis,false,sizeof vis);
    memset(dis, 63, sizeof dis);
    memset(output, 0, sizeof output);
    pair<int,int> p1(0,0);
    q.push(p1);
    vis[0][0] = true;
    dis[0][0] = 0; 
    road[0][0] = p1;
    while(!q.empty())
    {
        //bool is = false;
        pair<int,int> p = q.front();
        q.pop();
        for(int i=0 ;i<4 ;i++)
        {
            int x = p.first + dx[i];
            int y = p.second + dy[i];
            if(x>=0 && x<5 && y>=0 && y<5 && maze[x][y]==0 && vis[x][y]==false)
            {
                pair<int ,int> p2(x,y);
                q.push(p2);
                dis[x][y] = dis[p.first][p.second] + 1;
                vis[x][y] = true;
                pair<int ,int> p3(p.first,p.second);
                road[x][y] = p3;
                if(x==4 && y==5) break;    
            }
        }
    }
    
    int a =4 ,b = 4;
    int count = 24;
    while(a!=0 || b!=0)//把路径弄到数组output里 
    {
        int u = road[a][b].first;
        int v = road[a][b].second;
        pair<int ,int> p4(u,v);
        output[count--] = p4;
        a = u;
        b = v;
    }
    cout<<"(0, 0)"<<endl;
    for(int i=0 ;i<25 ;i++)
    {
        if(output[i].first==0 && output[i].second==0)
            continue;
        cout<<"("<<output[i].first<<", "<<output[i].second<<")"<<endl;
    }
    cout<<"(4, 4)"<<endl;    
}

int main()
{
    for(int i=0 ;i<5 ;i++)
        for(int j=0 ;j<5 ;j++)
            cin>>maze[i][j];
            
    bfs();
}

 

 

 

相关文章: