QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#549188#2345. Karel the RobotHKOI0RE 2771ms356900kbC++204.6kb2024-09-06 11:38:002024-09-06 11:38:00

Judging History

This is the latest submission verdict.

  • [2024-09-06 11:38:00]
  • Judged
  • Verdict: RE
  • Time: 2771ms
  • Memory: 356900kb
  • [2024-09-06 11:38:00]
  • Submitted

answer

#include <bits/stdc++.h>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()

using namespace std;
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;

template<typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
    for (auto x : v) os << x << ' ';
    os << '\n';
    return os;
}

const vector<char> dirc{'n','w','s','e'};
const vector<pii> dird{{-1,0},{0,-1},{1,0},{0,1}};

struct state {
    int x,y;
    char dir;
};

int to_state_num(state st) {
    return (st.x - 1) * 160 + (st.y - 1) * 4 + find(all(dirc),st.dir)-dirc.begin();
}

int dir_to_int(char dir) {
    return find(all(dirc),dir)-dirc.begin();
}

void solve() {
    int n,m,d,e;
    cin>>n>>m>>d>>e;
    vector<string> g(n+2);
    for(int i=1;i<=n;i++) {
        cin>>g[i];
        g[i]='#'+g[i]+'#';
    }
    g[0]=g[n+1]=string(m+2,'#');
    vector strs(200,string());
    for(int i=1;i<=d;i++) {
        string s;
        cin>>s;
        char c=s[0];
        strs[c]=s.substr(2);
    }

    // vector hv(200,vector<bool>(6407));
    map<pair<string,int>,state> val;
    set<pair<string,int>> vis;
    // vector val(200,vector<state>(6407));
    // auto vis=hv;
    // vector<state> st;

    auto eval = [&](auto&& eval,string s,state st) -> state {
        int num=to_state_num(st);
        // cout<<s<<' '<<sz(s)<<' '<<num<<'\n';
        if(val.find({s,num})!=val.end()) return val[{s,num}];
        if(vis.find({s,num})!=vis.end()) {
            return val[{s,num}]={-1,-1,'\0'};
        }
        if(s.empty()) return st;
        vis.emplace(s,num);

        auto get_pair = [&](int l) {
            int cnt=0;
            for(int j=l;j<sz(s);j++) {
                if(s[j]=='(') cnt++;
                else if(s[j]==')') cnt--;
                if(cnt==0) return j;
            }
        };

        if(s[0]=='m') {
            for(int j=0;j<4;j++)
                if(st.dir==dirc[j]) {
                    auto [dx,dy]=dird[j];
                    dx+=st.x;
                    dy+=st.y;
                    if(g[dx][dy]=='#') {
                        dx = st.x;
                        dy = st.y;
                    }
                    return val[{s,num}]=eval(eval, s.substr(1), {dx,dy,st.dir});
                }
        }
        else if(s[0]=='l') {
            char new_dir=dirc[(dir_to_int(st.dir)+1)%4];
            return val[{s,num}]=eval(eval,s.substr(1),{st.x,st.y,new_dir});
        }
        else if(s[0]=='i'||s[0]=='u') {
            char c=s[1];

            auto check = [&] {
                if(c=='b') {
                    auto dir=dir_to_int(st.dir);
                    auto [dx,dy]=dird[dir];
                    dx+=st.x;
                    dy+=st.y;
                    if(g[dx][dy]=='#') return true;
                    return false;
                }
                else {
                    return st.dir==c;
                }
            };

            if(s[0]=='i') {
                int l1=2;
                int r1=get_pair(l1);
                int l2=r1+1;
                int r2=get_pair(l2);
                string prog1=s.substr(l1+1,r1-l1-1);
                string prog2=s.substr(l2+1,r2-l2-1);
                
                if(check()) {
                    auto new_st=eval(eval,prog1,st);
                    return val[{s,num}]=eval(eval,s.substr(r2+1),new_st);
                }
                else {
                    auto new_st=eval(eval,prog2,st);
                    return val[{s,num}]=eval(eval,s.substr(r2+1),new_st);
                }
            }
            else {
                int l=2;
                int r=get_pair(l);
                string prog=s.substr(l+1,r-l-1);
                if(check()) return val[{s,num}]=eval(eval,s.substr(r+1),st);
                else {
                    auto new_st=eval(eval,prog,st);
                    return val[{s,num}]=eval(eval,s,new_st);
                }
            }
        }
        else {
            auto new_st=eval(eval,strs[s[0]],st);
            return val[{s,num}]=eval(eval,s.substr(1),new_st);
        }
    };

    for(int i=1;i<=e;i++) {
        int x,y;
        char dir;
        cin>>x>>y>>dir;
        string s;
        cin>>s;
        auto st=eval(eval,s,{x,y,dir});
        if(st.x==-1) cout<<"inf\n";
        else cout<<st.x<<' '<<st.y<<' '<<st.dir<<'\n';
    }
}

signed main() {
#ifndef LOCAL
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    cout << fixed << setprecision(10);
    int T = 1;
    // cin >> T;
    while (T--) solve();
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3880kb

Test #2:

score: 0
Accepted
time: 0ms
memory: 3860kb

Test #3:

score: 0
Accepted
time: 0ms
memory: 3656kb

Test #4:

score: 0
Accepted
time: 0ms
memory: 3588kb

Test #5:

score: 0
Accepted
time: 0ms
memory: 3596kb

Test #6:

score: 0
Accepted
time: 11ms
memory: 6812kb

Test #7:

score: 0
Accepted
time: 2771ms
memory: 356900kb

Test #8:

score: -100
Runtime Error