Submission #7195

#TimeUsernameProblemLanguageResultExecution timeMemory
7195baneling100Portals (BOI14_portals)C++98
100 / 100
344 ms34128 KiB
#include <stdio.h>
#include <queue>
#define INF 0x7fffffff

using namespace std;

queue <int> Q;
int R, C, Sy, Sx, Cy, Cx, A[1002][1002], B[1002][1002], D[1001][1001];
int Dy[4]={0,1,0,-1}, Dx[4]={1,0,-1,0};
int Left[1001][1001], Right[1001][1001], Up[1001][1001], Down[1001][1001];

void input(void)
{
    int i, j, x;
    char temp[1002];

    scanf("%d %d",&R,&C);
    for(i=1 ; i<=R ; i++)
    {
        scanf("%s",&temp[1]);
        for(j=1 ; j<=C ; j++)
        {
            if(temp[j]=='#')
                A[i][j]=1;
            else if(temp[j]=='S')
            {
                Sy=i;
                Sx=j;
            }
            else if(temp[j]=='C')
            {
                Cy=i;
                Cx=j;
            }
            D[i][j]=INF;
        }
    }
    for(i=1 ; i<=R ; i++)
    {
        x=0;
        for(j=1 ; j<=C ; j++)
        {
            if(A[i][j])
                x=0;
            else
            {
                if(!x)
                    x=j;
                Left[i][j]=x;
            }
        }
        x=0;
        for(j=C ; j>=1 ; j--)
        {
            if(A[i][j])
                x=0;
            else
            {
                if(!x)
                    x=j;
                Right[i][j]=x;
            }
        }
    }
    for(i=1 ; i<=C ; i++)
    {
        x=0;
        for(j=1 ; j<=R ; j++)
        {
            if(A[j][i])
                x=0;
            else
            {
                if(!x)
                    x=j;
                Up[j][i]=x;
            }
        }
        x=0;
        for(j=R ; j>=1 ; j--)
        {
            if(A[j][i])
                x=0;
            else
            {
                if(!x)
                    x=j;
                Down[j][i]=x;
            }
        }
    }
}

void process(void)
{
    int i, j, y, x, ty, tx;

    for(i=0 ; i<=R+1 ; i++)
        for(j=0 ; j<=C+1 ; j++)
        {
            B[i][j]=INF;
            if(i==0 || i==R+1 || j==0 || j==C+1 || A[i][j])
            {
                B[i][j]=0;
                Q.push(i);
                Q.push(j);
            }
        }
    while(!Q.empty())
    {
        y=Q.front();
        Q.pop();
        x=Q.front();
        Q.pop();
        for(i=0 ; i<=3 ; i++)
        {
            ty=y+Dy[i];
            tx=x+Dx[i];
            if(ty>=0 && ty<=R+1 && tx>=0 && tx<=C+1)
                if(B[ty][tx]>B[y][x]+1)
                {
                    B[ty][tx]=B[y][x]+1;
                    Q.push(ty);
                    Q.push(tx);
                }
        }
    }
    D[Sy][Sx]=0;
    Q.push(Sy);
    Q.push(Sx);
    while(!Q.empty())
    {
        y=Q.front();
        Q.pop();
        x=Q.front();
        Q.pop();
        for(i=0 ; i<=3 ; i++)
        {
            ty=y+Dy[i];
            tx=x+Dx[i];
            if(ty>=1 && ty<=R && tx>=1 && tx<=C && !A[ty][tx])
                if(D[ty][tx]>D[y][x]+1)
                {
                    D[ty][tx]=D[y][x]+1;
                    Q.push(ty);
                    Q.push(tx);
                }
        }
        ty=y;
        tx=Left[y][x];
        if(D[ty][tx]>D[y][x]+B[y][x])
        {
            D[ty][tx]=D[y][x]+B[y][x];
            Q.push(ty);
            Q.push(tx);
        }
        ty=y;
        tx=Right[y][x];
        if(D[ty][tx]>D[y][x]+B[y][x])
        {
            D[ty][tx]=D[y][x]+B[y][x];
            Q.push(ty);
            Q.push(tx);
        }
        ty=Up[y][x];
        tx=x;
        if(D[ty][tx]>D[y][x]+B[y][x])
        {
            D[ty][tx]=D[y][x]+B[y][x];
            Q.push(ty);
            Q.push(tx);
        }
        ty=Down[y][x];
        tx=x;
        if(D[ty][tx]>D[y][x]+B[y][x])
        {
            D[ty][tx]=D[y][x]+B[y][x];
            Q.push(ty);
            Q.push(tx);
        }
    }
}

void output(void)
{
    printf("%d",D[Cy][Cx]);
}

int main(void)
{
    input();
    process();
    output();

    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...