Submission #29803

#TimeUsernameProblemLanguageResultExecution timeMemory
29803TAMREFPortals (BOI14_portals)C++11
100 / 100
333 ms15108 KiB
#include <bits/stdc++.h> #define vc first #define vp second #define all(X) X.begin(),X.end() using namespace std; typedef pair<int,int> pii; const int mx=1005, inf=1e8; int s,e; int R,C; int D[mx*mx]; vector<int> rs[mx], cs[mx], rrs[mx], rcs[mx]; char buf[mx][mx+8]; void input(){ scanf("%d %d\n",&R,&C); for(int i=1;i<=R;i++) scanf("%s",buf[i]+1); for(int i=0;i<=C+1;i++) buf[0][i]=buf[R+1][i]='#'; for(int j=0;j<=R+1;j++) buf[j][0]=buf[j][C+1]='#'; for(int i=0;i<R+2;i++){ for(int j=0;j<C+2;j++){ if(buf[i][j]=='S') s=i*(C+2)+j; else if(buf[i][j]=='C') e=i*(C+2)+j; else if(buf[i][j]=='#'){ rs[i].push_back(j); cs[j].push_back(i); } } } for(int i=0;i<R+2;i++){ rrs[i]=rs[i]; reverse(all(rrs[i])); } for(int j=0;j<C+2;j++){ rcs[j]=cs[j]; reverse(all(rcs[j])); } /* for(int i=0;i<R+2;i++,puts("")) for(int k : rs[i]) printf("%d ",k); for(int j=0;j<C+2;j++,puts("")) for(int k : cs[j]) printf("%d ",k); for(int i=0;i<=R+1;i++) puts(buf[i]); */ fill(D,D+(R+2)*(C+2),inf); R+=2, C+=2; } void dijk(){ priority_queue<pii,vector<pii>,greater<pii>> q; int dr[4]={1,-1,C,-C}; q.push(pii(D[s]=0,s)); while(!q.empty()){ pii u = q.top(); q.pop(); int flag=0,tr=u.vp/C,tc=u.vp%C; if(buf[tr][tc]=='#' || D[u.vp]<u.vc) continue; //printf("(%d,%d) arrived\n",tr,tc); for(int t=0;t<4;t++){ int np=u.vp+dr[t]; if(buf[np/C][np%C]=='#') flag=1; else{ if(D[np]>u.vc+1) q.push(pii(D[np]=u.vc+1,np)); } } int nr[4]={tr,tr,*lower_bound(all(cs[tc]),tr)-1,*lower_bound(all(rcs[tc]),tr,greater<int>())+1}, nc[4]={*lower_bound(all(rs[tr]),tc)-1,*lower_bound(all(rrs[tr]),tc,greater<int>())+1,tc,tc}, np, cost[4]; if(flag) for(int t=0;t<4;t++) cost[t]=1; else{ for(int t=0;t<4;t++){ cost[t]=inf; for(int u=0;u<4;u++) cost[t]=min(cost[t],abs(tr-nr[u])+abs(tc-nc[u])+1); } } for(int t=0;t<4;t++){ np=nr[t]*C+nc[t]; if(D[np]>u.vc+cost[t]) q.push(pii(D[np]=u.vc+cost[t],np)); } } } int main(){ input(); dijk(); printf("%d\n",D[e]); }

Compilation message (stderr)

portals.cpp: In function 'void input()':
portals.cpp:14:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d\n",&R,&C);
                           ^
portals.cpp:15:47: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i=1;i<=R;i++) scanf("%s",buf[i]+1);
                                               ^
#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...