This question is undoubtedly a classic question for learning bfs. It is not very difficult, but it is necessary to pay attention to some details~
It is really dead to accidentally type NESW into NEWS,
const char* dirs = “NESW”;
Code below~
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
using namespace std;
const char* dirs = "NESW";
const char* turns = "FLR";
int dir_id(char c ){return strchr(dirs, c) - dirs;}
int turn_id(char c){return strchr(turns, c) -turns;}
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
struct Node{
int r;
int c;
int dir;
Node(int r=0, int c=0, int dir=0){
this->c = c;
this->r = r;
this->dir = dir;
}
};
Node walk(const Node& u, int turn){
int dir = u.dir;
if(turn == 1) dir = (dir+3)%4;
if(turn == 2) dir = (dir + 1)%4;
return Node(u.r+dr[dir], u.c+dc[dir], dir);
}
int r0, c0, dir, r1, c1, r2,c2;//起点, 起点朝向, 终点.
const int maxn = 20;
int d[maxn][maxn][maxn];
Node p[maxn][maxn][maxn];
int has_edge[maxn][maxn][maxn][maxn];
void print_ans(Node u){
vector<Node> nodes;
for(;;){
nodes.push_back(u);
if(d[u.r][u.c][u.dir] == 0) break;
u = p[u.r][u.c][u.dir];
}
nodes.push_back(Node(r0, c0, dir));
int cnt = 0;
for(int i = nodes.size()-1; i>=0; i--){
if(cnt % 10 == 0) printf(" ");
printf(" (%d, %d)", nodes[i].r, nodes[i].c);
if(++cnt % 10 == 0) printf("\n");
}
if(nodes.size() % 10 != 0) printf("\n");
}
bool inside(int r, int c){
return r>= 1 && r<=9 && c>= 1 && c<=9;
}
void solve(){
queue<Node> q;
memset(d, -1, sizeof(d));
Node u(r1, c1, dir);
d[u.r][u.c][dir] = 0;
q.push(u);
while(!q.empty()){
Node u = q.front();q.pop();
if(u.r == r2 && u.c == c2){ print_ans(u);return;}
for(int i = 0; i < 3; i++){
Node v = walk(u, i);
if(has_edge[u.r][u.c][u.dir][i] && inside(v.r, v.c) && d[v.r][v.c][v.dir] < 0){
d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + 1;
p[v.r][v.c][v.dir] = u;
q.push(v);
}
}
}
printf("No Solution Possible.\n");
}
int main()
{
memset(p, 0, sizeof(p));
memset(has_edge, 0, sizeof(has_edge));
char c;
scanf("%d%d", &r0, &c0);
cin >> c;
scanf("%d%d%",&r2, &c2);
dir = dir_id(c);
r1 = r0 + dr[dir]; c1 = c0 + dc[dir];
//构建整个图
int row, col;
while(cin >> row){
if(row == 0) break;
cin >> col;
string s;
while(cin >> s){
if(s == "*") break;
int dirid = dir_id(s[0]);
for(int i = 1; i <s.length(); i++){
has_edge[row][col][dirid][turn_id(s[i])] = 1;
}
}
}
solve();
return 0;
}