Cod sursa(job #1097334)

Utilizator hevelebalazshevele balazs hevelebalazs Data 3 februarie 2014 12:25:12
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define rf(i,a,b) for(int i=b-1;i>=a;--i)
#define N 1000
int a[N][N];
int B[N][N],b;
int Qx[N*N],Qy[N*N],q;
int n,m;
int ix,iy,ox,oy;

inline void upd(int i,int j,int z){
    if(i<0||i>=n)return;
    if(j<0||j>=m)return;
    if(B[i][j]==b)return;
    if(a[i][j]<z)return;
    B[i][j]=b;
    Qx[q]=i;
    Qy[q++]=j;
    }

bool p(int z){
    if(a[ix][iy]<z)return false;
    int x=ix,y=iy;
    q=1;
    Qx[0]=x,Qy[0]=y;
    B[x][y]=b;
    fr(i,0,q){
        x=Qx[i],y=Qy[i];
        if(x==ox&&y==oy)return true;
        upd(x-1,y,z);
        upd(x+1,y,z);
        upd(x,y-1,z);
        upd(x,y+1,z);
        }
    return false;
    }

inline void upd1(int i,int j,int i1,int j1){
    if(i<0||i>=n)return;
    if(j<0||j>=m)return;
    if(B[i][j]==b)return;
    if(a[i][j]!=-1&&a[i][j]<a[i1][j1]+1)return;
    a[i][j]=a[i1][j1]+1;
    Qx[q]=i,Qy[q++]=j;
    B[i][j]=b;
    }

int main(){
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    char c;
    scanf("%i%i\n",&n,&m);
    q=0;
    fr(i,0,n) {
        fr(j,0,m) {
            scanf("%c",&c);
            if(c=='D')a[i][j]=0,Qx[q]=i,Qy[q++]=j;
            else if(c=='I') ix=i,iy=j,a[i][j]=-1;
            else if(c=='O') ox=i,oy=j,a[i][j]=-1;
            else if(c!='.') a[i][j]=-2;
            else a[i][j]=-1;
            }
        scanf("\n");
        }

    b=1;

    fr(i,0,q){
        upd1(Qx[i]-1,Qy[i],Qx[i],Qy[i]);
        upd1(Qx[i]+1,Qy[i],Qx[i],Qy[i]);
        upd1(Qx[i],Qy[i]-1,Qx[i],Qy[i]);
        upd1(Qx[i],Qy[i]+1,Qx[i],Qy[i]);
        }

    fr(i,0,n)fr(j,0,m)B[i][j]=1;
    b=2;
    int l=-1,r=2046;
    while(l<r){
        int c=(l+r+1)/2;
        if(p(c)) l=c;
        else r=c-1;
        ++b;
        }
    printf("%i",l);
    return 0;
    }