Submission #404609

#TimeUsernameProblemLanguageResultExecution timeMemory
404609cadmiumskyAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
41 ms8528 KiB
#include <iostream> using namespace std; char dir[505][505][4]; char orig[505][505]; int arriv[505][505][4]; int n,m; int dirx[4]={-1,0,1,0}; int diry[4]={0,1,0,-1}; class QUEUE { int qx[262144]; int qy[262144]; int qp[262144]; int l,r; public: void reset() { l=0; r=0; } void pushb(int x,int y,int p) { qx[r]=x; qy[r]=y; qp[r++]=p; r&=262143; } void pushf(int x,int y, int p) { l=(l-1)&262143; qx[l]=x; qy[l]=y; qp[l]=p; } void pop() { l=(l+1)&262143; } int topx() { return qx[l]; } int topy() { return qy[l]; } int topp() { return qp[l]; } bool empty() { return l==r; } }que; static int dbfs() { if(que.empty()) return -1; int x=que.topx(),y=que.topy(),p=que.topp(); que.pop(); if(x==n && y==m) return arriv[x][y][p]; if(p==4) return dbfs(); int c=dir[x][y][p]; //cout << x <<' '<< y <<' '<< p << '\n'; //cout << dirx[c] <<' '<< diry[c] << ' '<< c << "\n\n"; if(c==-1) return dbfs(); dir[x][y][p]=-1; que.pushf(x+dirx[c],y+diry[c],0); arriv[x+dirx[c]][y+diry[c]][0]=arriv[x][y][p]; if(p!=3) { que.pushb(x,y,p+1); arriv[x][y][p+1]=arriv[x][y][p]+1; } return dbfs(); } int main() { cin >> n >> m; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin >> dir[i][j][0]; if(dir[i][j][0]=='N') dir[i][j][0]=0; else if(dir[i][j][0]=='E') dir[i][j][0]=1; else if(dir[i][j][0]=='S') dir[i][j][0]=2; else if(dir[i][j][0]=='W') dir[i][j][0]=3; else dir[i][j][0]=-1; if(dir[i][j][0]!=-1) { for(int h=1; h<4; h++) dir[i][j][h]=((dir[i][j][h-1]+1)&3); } } } for(int i=0; i<=n+1; i++) { for(int j=0; j<4; j++) dir[i][0][j]=dir[i][m+1][j]=-1; } for(int i=0; i<=m+1; i++) { for(int j=0; j<4; j++) dir[n+1][i][j]=dir[0][i][j]=-1; } if(dir[1][1][0]==-1) { cout << -1 <<'\n'; return 0; } que.reset(); que.pushb(1,1,0); cout << dbfs() <<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...