poj 3984 bfs加递归记录路径题解

刚看到这一道题,我个人是狂喜的。没错就是狂喜,哈哈哈

后来才明白每一道中文题目都不是从天下掉下里的。哎,根本不会输出路径的问题,于是在网上找呀找 找到外婆桥,终于找到了一种我比较好理解的方法。就是用vis数组保持前缀进行回溯,我们平时在处理vis标记时大多用的波尔数组只存在0,1;而这次我们把他开成int类型,每次都记录上一次走的方向就可以了,那么问题来了如果这一步走的是方向数组的dir[0]这一步的话就会与标记是否走过起冲突,而再开一个数组对空间的浪费又太大,这个时候我们只需要把i+1存入vis数组就可以了,在每次回溯的时候再把1减去,那么回溯是怎么才能停止呢,它的边界条件是什么,这里采用的是让初始点的vis为-1才解决这个问题,当判断-1出现就不需要接着向下面递归了。
代码就直接贴出来了。对了问题的 链接http://poj.org/problem?id=3984;
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int map[5][5],vis[5][5];
int dir[4][2]={1,0 ,-1,0 ,0,-1 ,0,1};
const int ex=4,ey=4;
struct point
{
    int x;
    int y;
};
bool check(struct point a)
{
    if(a.x<0||a.x>=5||a.y<0||a.y>=5) return 0;
    return 1;
}

void bfs()
{
    queue<point> que;
    struct point head,next;
    head.x=0;head.y=0;
    que.push(head);
    while(!que.empty())
    {
        head=que.front();
        que.pop();
        if(head.x==ex&&head.y==ey)
        {
            return ;
        }
        for(int i=1;i<=4;i++)
        {
            next.x=head.x+dir[i-1][0];
            next.y=head.y+dir[i-1][1];
            if(check(next)&&!map[next.x][next.y]&&vis[next.x][next.y]==0)
            {
                vis[next.x][next.y]=i;
                que.push(next);
            }
        }
    }
}
void pr(int x,int y)
{
    if(vis[x][y]!=-1)
    {
        int xx,yy;
        xx=x-dir[vis[x][y]-1][0];
        yy=y-dir[vis[x][y]-1][1];
        pr(xx,yy);
    }
   printf("(%d, %d)\n",x,y);
}


int main()
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            scanf("%d",&map[i][j]);
        }
    }
    memset(vis,0,sizeof(vis));
    vis[0][0]=-1;
    bfs();
    pr(ex,ey);
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值