RE 求助
查看原帖
RE 求助
275273
zltqwq楼主2021/1/10 17:35

几乎是照着紫书写的。。但提交的时候 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;
}
2021/1/10 17:35
加载中...