这一题是求最短路,所以使用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