poj 3984 迷宫问题 (BFS+记录路径)

题目连接:http://poj.org/problem?id=3984

题解:简单的BFS+记录路径,具体题解看代码注释。

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

struct point
{
    int x;
    int y;
};
queue<point>q;
int map[5][5];
int vis[5][5];//标记走过的路
int g[4][2]={0,1,0,-1,1,0,-1,0};//四个方向
int lx[5][5],ly[5][5];//记录到达这个点的前一个点

void bfs()
{
    point p;
    p.x=0;
    p.y=0;
    q.push(p);
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        if(p.x==4 && p.y==4)
            return;
        for(int i=0;i<4;i++)
        {
            int x=p.x+g[i][0];
            int y=p.y+g[i][1];
            if(x<0 || x>4 || y<0 || y>4 || vis[x][y] || map[x][y])
                continue;
            point temp;
            temp.x=x;
            temp.y=y;
            q.push(temp);
            vis[x][y]=1;   //对走过的路进行标记
            lx[x][y]=p.x;  //记录到达这个点的前一个点的x坐标
            ly[x][y]=p.y;  //记录到达这个点的前一个点的y坐标
        }
    }
}

void cout_way(int x,int y)//递归输出
{
    if(x||y) cout_way(lx[x][y],ly[x][y]);
    printf("(%d, %d)\n",x,y);
}
int main()
{
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            cin>>map[i][j];
    bfs();
    cout_way(4,4);
    /*for(int i=0;i<5;i++)//每一个状态之前的状态
    {
        for(int j=0;j<5;j++)
            printf("(%d,%d) \n",lx[i][j],ly[i][j]);
        cout<<endl;
    }*/
    return 0;
}

 

posted on 2015-04-22 11:07  猫哥小俊  阅读(213)  评论(0编辑  收藏  举报

导航