Cod sursa(job #1093640)

Utilizator hevelebalazshevele balazs hevelebalazs Data 28 ianuarie 2014 14:10:36
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <string.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(a[i1][j1]>=0&&(a[i][j]==-1||a[i][j]>a[i1][j1]+1)) a[i][j]=a[i1][j1]+1;
    }

int main(){
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    char c;
    scanf("%i%i\n",&n,&m);
    fr(i,0,n) {
        fr(j,0,m) {
            scanf("%c",&c);
            if(c=='D')a[i][j]=0;
            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!='.') B[i][j]=1,a[i][j]=-1;
            else a[i][j]=-1;
            }
        scanf("\n");
        }

    fr(i,0,n){
        fr(j,1,n) upd1(i,j,i,j-1);
        rf(j,0,n-1) upd1(i,j,i,j+1);
        }

    fr(j,0,n){
        fr(i,1,n) upd1(i,j,i-1,j);
        rf(i,0,n-1) upd1(i,j,i+1,j);
        }

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