Cod sursa(job #1752130)

Utilizator giotoPopescu Ioan gioto Data 2 septembrie 2016 20:22:47
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <cstdio>
#define min(a,b) (a<b)?a:b
#define max(a,b) (a>b)?a:b
#define INF 2000000000
#define NMAX 1002
using namespace std;

int solutie=-1,ul,Min,solpoz,st,n,m,ic,il,x,y,sol=INF,t[NMAX][NMAX],d[NMAX][NMAX];
char s[NMAX][NMAX];bool ok[NMAX][NMAX];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
struct coada{
    int l,c;
}q[1000002],z;
void lee(){
    st=1;int aux=ul;
    while(st<=ul){
        z=q[st++];
        for(short k=0;k<4;++k){
            short l=z.l+dx[k],c=z.c+dy[k];
            if(l>=0&&l<n&&c>=0&&c<m&&t[z.l][z.c]+1<t[l][c]){
                if(s[l][c]!='*'){
                    t[l][c]=t[z.l][z.c]+1;
                    q[++ul].l=l,q[ul].c=c;
                }else if(aux>=st){
                    if(k<2){
                        t[l][c-1]=1;t[l][c+1]=1;
                        q[++ul].l=l,q[ul].c=c+1;
                        q[++ul].l=l,q[ul].c=c-1;
                    }

                    else {
                        t[l-1][c]=1;t[l+1][c]=1;
                        q[++ul].l=l+1,q[ul].c=c;
                        q[++ul].l=l-1,q[ul].c=c;
                    }
                }
            }
        }
    }
}
void lee2(short l1,short c1)
{
    st=1,ul=1;d[l1][c1]=t[l1][c1];
    q[st].l=l1,q[ul].c=c1;
    while(st<=ul){
        z=q[st++];sol=d[z.l][z.c];
        for(short k=0;k<4;++k){
            short l=z.l+dx[k],c=z.c+dy[k];
            if(l>=0&&l<n&&c>=0&&c<m&&s[l][c]!='*'){
                int aux=sol;
                sol=min(sol,t[l][c]);
                if(sol>d[l][c]){
                    q[++ul].l=l,q[ul].c=c;
                    d[l][c]=sol;
                    if(l==x&&c==y)
                        solutie=max(solutie,sol);
                }sol=aux;
            }
        }
    }
}
int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i=0;i<n;++i)
        scanf("%s", s[i]);
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j){
            t[i][j]=INF;d[i][j]=-1;
            if(s[i][j]=='I')ic=j,il=i;
            else if(s[i][j]=='O') x=i,y=j;
            else if(s[i][j]=='D')
                {q[++ul].l=i,q[ul].c=j;t[i][j]=0;}
        }
    lee();
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j)
            if(t[i][j]==INF) t[i][j]=-1;
    d[il][ic]=t[il][ic];lee2(il,ic);
    printf("%d\n", solutie);
//    for(int i=0;i<n;++i){
//        for(int j=0;j<m;++j)
//        printf("%d ",t[i][j]);
//        printf("\n");
//    }
    return 0;
}