Submission #14816

#TimeUsernameProblemLanguageResultExecution timeMemory
14816eaststarPortals (BOI14_portals)C++98
100 / 100
179 ms146164 KiB
#include <stdio.h> #include <algorithm> using namespace std; struct Q{ int r,c,d; Q(){} Q(int r,int c,int d):r(r),c(c),d(d){} bool operator<(const Q&r)const{ return d>r.d; } }q[10000010]; int a[1010][1010],n,m,sr,sc,er,ec; int b[1010][1010][4],dis[1010][1010],t[1010][1010]; int x[]={-1,0,1,0},y[]={0,1,0,-1}; void BFS(){ int i,j,r,c,d,nr,nc,p=1; for(i=1;i<=n;++i){ for(j=1;j<=m;++j)dis[i][j]=1e7; } dis[sr][sc]=0; q[0]=Q(sr,sc,0); while(p){ r=q[0].r,c=q[0].c,d=q[0].d; if(r==er&&c==ec)break; pop_heap(q,q+p); --p; for(i=0;i<4;++i){ nr=r+x[i],nc=c+y[i]; if(a[nr][nc]||dis[nr][nc]<=d+1)continue; q[p++]=Q(nr,nc,d+1); push_heap(q,q+p); dis[nr][nc]=d+1; } for(i=0;i<4;++i){ if(i%2)nr=r,nc=b[r][c][i]; else nr=b[r][c][i],nc=c; if(dis[nr][nc]<=d+t[r][c]+1)continue; q[p++]=Q(nr,nc,d+t[r][c]+1); push_heap(q,q+p); dis[nr][nc]=d+t[r][c]+1; } } printf("%d",q[0].d); } void portal(){ int i,j,k,l; for(i=1;i<=n;++i){ for(j=1;j<=m;++j)if(!a[i][j]){ if(a[i][j-1])l=j; if(a[i][j+1])for(k=l;k<=j;++k)b[i][k][1]=j,b[i][k][3]=l,t[i][k]=min(k-l,j-k); } } for(i=1;i<=m;++i){ for(j=1;j<=n;++j)if(!a[j][i]){ if(a[j-1][i])l=j; if(a[j+1][i])for(k=l;k<=j;++k)b[k][i][0]=l,b[k][i][2]=j,t[k][i]=min(min(k-l,j-k),t[k][i]); } } } void input(){ int i,j; char c[1010]; scanf("%d%d",&n,&m); for(i=0;i<=n+1;++i)a[i][0]=a[i][m+1]=1; for(i=1;i<=m;++i)a[0][i]=a[n+1][i]=1; for(i=1;i<=n;++i){ scanf("%s",c+1); for(j=1;j<=m;++j){ if(c[j]=='S')sr=i,sc=j; if(c[j]=='C')er=i,ec=j; if(c[j]=='#')a[i][j]=1; } } } int main(){ input(); portal(); BFS(); return 0; }
#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...