几乎是照着紫书写的。。但提交的时候 RE 了
uDebug 上测试没有问题
#include <bits/stdc++.h>
using namespace std;
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
struct node
{
int x, y, dir;
};
bool has_edge[12][12][5][5];
int sx, sy, ssx, ssy, ex, ey, d[12][12][5], sd;
node p[12][12][5];
int dir_id(char c)
{
if (c == 'N') return 0;
if (c == 'E') return 1;
if (c == 'S') return 2;
return 3;
}
int turn_id(char c)
{
if (c == 'F') return 0;
if (c == 'L') return 1;
return 2;
}
node walk(const node &u, int turn)
{
int d = u.dir;
if (turn == 1) d = (d + 3) % 4;
if (turn == 2) d = (d + 1) % 4;
return {u.x + dx[d], u.y + dy[d], d};
}
bool inside(const node &u)
{
return u.x > 0 && u.x < 10 && u.y > 0 && u.y < 10;
}
void print_ans(node u)
{
vector<node> nodes;
for (;;)
{
nodes.push_back(u);
if (!d[u.x][u.y][u.dir]) break;
u = p[u.x][u.y][u.dir];
}
nodes.push_back({ssx, ssy, sd});
int cnt = 0;
for (int i = nodes.size() - 1; i >= 0; --i)
{
if (!(cnt % 10)) cout << ' ';
cout << " (" << nodes[i].x << ',' << nodes[i].y << ')';
if (!(++cnt % 10)) cout << '\n';
}
if (nodes.size() % 10) cout << '\n';
}
void solve()
{
queue<node> q;
memset(d, -1, sizeof(d));
q.push({sx, sy, sd});
d[sx][sy][sd] = 0;
while (!q.empty())
{
node u = q.front();
q.pop();
if (u.x == ex && u.y == ey)
{
print_ans(u);
return;
}
for (int i = 0; i < 3; ++i)
{
node v = walk(u, i);
if (!has_edge[u.x][u.y][u.dir][i]) continue;
if (!inside(v)) continue;
if (d[v.x][v.y][v.dir] >= 0) continue;
d[v.x][v.y][v.dir] = d[u.x][u.y][u.dir] + 1;
p[v.x][v.y][v.dir] = u;
q.push(v);
}
}
cout << " No Solution Possible\n";
}
bool read()
{
string s;
char sdir;
cin >> s;
if (s == "END") return 0;
cout << s << '\n';
cin >> ssx >> ssy >> sdir >> ex >> ey;
sd = dir_id(sdir);
sx = ssx + dx[sd], sy = ssy + dy[sd];
int x, y;
memset(has_edge, 0, sizeof(has_edge));
while (cin >> x && x)
{
cin >> y;
string dirs;
while (cin >> dirs && dirs[0] != '*')
{
for (int i = 1; i < dirs.size(); ++i)
has_edge[x][y][dir_id(dirs[0])][turn_id(dirs[i])] = 1;
}
}
}
int main()
{
ios::sync_with_stdio(0);
// freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
while (read()) solve();
return 0;
}