Cod sursa(job #1159424)

Utilizator TibixbAndrei Tiberiu Tibixb Data 29 martie 2014 16:24:56
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include<fstream>
using namespace std;
int n, m, i, j, x1, x2, y1, y2, ic, jc, iv, jv, d, c[3][1000003], a[1003][1003], p, u, u1, p1, b[1003][1003], ic1, jc1, iv1, jv1, d1, mij;
int di[5]={1, -1, 0, 0};
int dj[5]={0, 0, 1, -1};
char ch;
int verif(int x){
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            b[i][j]=0;
    u1=0;
    p1=0;
    c[0][++u1]=x1;
    c[1][1]=y1;
    p1=1;
     while(p1<=u1 && b[x2][y2]==0){
        ic1=c[0][p1];
        jc1=c[1][p1];
        for(d1=0; d1<=3; d1++){
            iv1=ic1+di[d1];
            jv1=jc1+dj[d1];
            if(iv1>=1 && iv1<=n && jv1>=1 && jv1<=m && a[ic1][jc1]>=x && a[iv1][jv1]>=x && b[iv1][jv1]==0){
                c[0][++u1]=iv1;
                c[1][u1]=jv1;
                b[iv1][jv1]=1;
            }
        }
        p1++;
     }
     if(b[x2][y2]==1)
        return 1;
     return 0;
}
ifstream in("barbar.in");
ofstream out("barbar.out");
int main(){
    in>>n>>m;
    for(i=1; i<=n; i++){
        for(j=1; j<=m; j++){
            in>>ch;
            if(ch=='.')
                a[i][j]=0;
            if(ch=='*')
                a[i][j]=-1;
            if(ch=='D'){
                a[i][j]=-2;
                c[0][++u]=i;
                c[1][u]=j;
            }
            if(ch=='I'){
                a[i][j]=0;
                x1=i;
                y1=j;
            }
            if(ch=='O'){
                a[i][j]=0;
                x2=i;
                y2=j;
            }
        }
    }
    p=1;
    while(p<=u){
        ic=c[0][p];
        jc=c[1][p];
        for(d=0; d<=3; d++){
            iv=ic+di[d];
            jv=jc+dj[d];
            if(iv>=1 && iv<=n && jv>=1 && jv<=m && (a[iv][jv]==0 || a[ic][jc]+1<a[iv][jv])){
                c[0][++u]=iv;
                c[1][u]=jv;
                if(a[ic][jc]==-2)
                    a[iv][jv]=1;
                else
                    a[iv][jv]=a[ic][jc]+1;
            }
        }
        p++;
    }
    //for(i=1; i<=n; i++){
        //for(j=1; j<=m; j++){
            //out<<a[i][j]<<" ";
        //}
        //out<<"\n";
    //}
    p=1; u=n+m;
    while(p<=u){
        //out<<1<<" ";
        mij=p+(u-p)/2;
        if(verif(mij))
            p=mij+1;
        else
            u=mij-1;
    }
    out<<u;
return 0;
}