QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#549185 | #2345. Karel the Robot | HKOI0 | RE | 3022ms | 356808kb | C++20 | 4.6kb | 2024-09-06 11:35:37 | 2024-09-06 11:35:38 |
Judging History
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) {
assert(dir != '\0');
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;
}
assert(false);
};
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: 3680kb
Test #2:
score: 0
Accepted
time: 1ms
memory: 3856kb
Test #3:
score: 0
Accepted
time: 1ms
memory: 3568kb
Test #4:
score: 0
Accepted
time: 1ms
memory: 3556kb
Test #5:
score: 0
Accepted
time: 1ms
memory: 3812kb
Test #6:
score: 0
Accepted
time: 12ms
memory: 6836kb
Test #7:
score: 0
Accepted
time: 3022ms
memory: 356808kb
Test #8:
score: -100
Runtime Error