Cod sursa(job #1715560)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 11 iunie 2016 09:28:17
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.97 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>

#define BUF_SIZE 16384
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi;
inline char nextch(){
    if(pbuf==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fi);
        pbuf=0;
    }
    return buf[pbuf++];
}
inline int nextnum(){
    int a=0;
    char c=nextch();
    while(c<'0' || c>'9')
        c=nextch();
    while('0'<=c && c<='9'){
        a=a*10+c-'0';
        c=nextch();
    }
    return a;
}

int d[1001][1001];
int vst[1001][1001];
int q[2000000][2], p, u, row, column;

inline int valid(int l, int c){
    if(l>0 && l<=row && c>0 && c<=column && vst[l][c]==0)
        return 1;
    return 0;
}

int dfs(int x1, int y1, int x2, int y2, int lim){
    for(int i=1;i<=row;i++)
        for(int j=1;j<=column;j++)
            vst[i][j]=0;
    int dir[4][2]={{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    vst[x1][y1]=1;
    p=u=0;
    q[u][0]=x1;
    q[u][1]=y1;
    u++;
    while(p<u){
        for(int i=0;i<4;i++){
            if(valid(q[p][0]+dir[i][0], q[p][1]+dir[i][1]) && d[q[p][0]+dir[i][0]][q[p][1]+dir[i][1]]>=lim){
                vst[q[p][0]+dir[i][0]][q[p][1]+dir[i][1]]=1;
                q[u][0]=q[p][0]+dir[i][0];
                q[u][1]=q[p][1]+dir[i][1];
                u++;
            }
        }
        p++;
    }
    if(vst[x2][y2]==1)
        return 1;
    return 0;
}

int main(){
    int i1, i2, o1, o2;
    FILE*fo;
    fi=fopen("barbar.in","r");
    fo=fopen("barbar.out","w");
    fscanf(fi,"%d%d", &row, &column);
    nextch();
    for(int i=1;i<=row;i++)
        for(int j=1;j<=column;j++)
            d[i][j]=-1;
    for(int i=1;i<=row;i++){
        for(int j=1;j<=column;j++){
            char c=nextch();
            switch(c){
                case 'D':{
                    d[i][j]=0;
                    vst[i][j]=1;
                    q[u][0]=i;
                    q[u][1]=j;
                    u++;
                    break;
                }
                case '*':{
                    d[i][j]=-2;
                    vst[i][j]=1;
                    break;
                }
                case 'I':{
                    i1=i;
                    i2=j;
                    break;
                }
                case 'O':{
                    o1=i;
                    o2=j;
                    break;
                }
            }
        }
        nextch();
    }
    while(p<u){
        if(valid(q[p][0]-1, q[p][1])){
            q[u][0]=q[p][0]-1;
            q[u][1]=q[p][1];
            u++;
            d[q[p][0]-1][q[p][1]]=1+d[q[p][0]][q[p][1]];
            vst[q[p][0]-1][q[p][1]]=1;
        }
        if(valid(q[p][0]+1, q[p][1])){
            q[u][0]=q[p][0]+1;
            q[u][1]=q[p][1];
            u++;
            d[q[p][0]+1][q[p][1]]=1+d[q[p][0]][q[p][1]];
            vst[q[p][0]+1][q[p][1]]=1;
        }
        if(valid(q[p][0], q[p][1]-1)){
            q[u][0]=q[p][0];
            q[u][1]=q[p][1]-1;
            u++;
            d[q[p][0]][q[p][1]-1]=1+d[q[p][0]][q[p][1]];
            vst[q[p][0]][q[p][1]-1]=1;
        }
        if(valid(q[p][0], q[p][1]+1)){
            q[u][0]=q[p][0];
            q[u][1]=q[p][1]+1;
            u++;
            d[q[p][0]][q[p][1]+1]=1+d[q[p][0]][q[p][1]];
            vst[q[p][0]][q[p][1]+1]=1;
        }
        p++;
    }
    int st=0, dr=d[i1][i2];
    while(dr-st>1){
        int m=(st+dr)/2;
        //printf("%d %d\n", m, dfs(i1, i2, o1, o2, m));
        if(dfs(i1, i2, o1, o2, m))
            st=m;
        else
            dr=m-1;
    }
    if(dfs(i1, i2, o1, o2, dr))
        fprintf(fo,"%d", dr);
    else{
        if(st!=0)
            fprintf(fo,"%d", st);
        else
            fprintf(fo,"-1");
    }
    /*for(int i=1;i<=row;i++){
        for(int j=1;j<=column;j++)
            fprintf(fo,"%02d ", d[i][j]);
        fprintf(fo,"\n");
    }*/
    fclose(fi);
    fclose(fo);
    return 0;
}