uva816 -- Abbott's Revenge (BFS)

题目在此

这一题是求最短路,所以使用BFS来求解,难点主要是如何根据当前位置的朝向(NESW)和转向(LFR)来确定下一位置坐标,朝向和所有可能的转向,然而这一题我的AC过程很不顺利,起初是迷之Runtime Error,我以为是输出的时候采用递归导致栈溢出,改成循环后还是RE,后来不知道改了什么,终于不RE了,又开始了无限Wrong Answer,还好最后找出了WA的原因:是我对输入理解有误导致的,比如题目给出的测试迷宫SAMPLE中,有这样的一组数据:1 2 WLF NR ER * ,我起初认为在输入时对于每一个交叉点,N,E,S,W最多只会出现一次,但真实的情况是方向N,E,S,W可以出现多次,即1 2 WL WF NR ER * 输入中也是存在的,由于没有考虑这种情况,所以WA,做了相应改动之后就顺利AC了,除此之外还有一点需要注意:在BFS的时候,从队列中取出的第一个结点对应的坐标不是开始位置,而是开始位置沿着开始时的方向走一步得到的,AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
using namespace std;

struct Node     //迷宫交叉点类型
{
    int r;
    int c;
    int len;    //交叉点之后字符串的个数,比如1 2 WLF NR ER *,len=3
    string dir[20];  //存储交叉点坐标之后的字符串
};
vector<Node> maze;  //存储迷宫

struct State    //BFS状态结点
{
    int r;
    int c;
    char dir;   //朝向,取N,E,S,W
    char rlf;   //转向,取L,F,R
    State* parent;  //父节点,用于输出

    State(int r,int c,char dir,char rlf):r(r),c(c),dir(dir),rlf(rlf),parent(NULL){}
};
queue<State*> q;

int sr,sc,er,ec; //开始坐标(sr,sc),目标坐标(er,ec)
char sdir
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值