Cod sursa(job #1865977)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 2 februarie 2017 14:03:59
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <cstdio>
#include <algorithm>
#include <bitset>
#define INF 2000000000

using namespace std;
int a[1001][1001],dd[1001][1001];
pair <int,int> l[1000001];
bitset <1001> f[1001];
int di[]={0,0,1,-1};
int dj[]={-1,1,0,0};
int verif (int mid,int n,int m){
    int p,u,iv,jv,d;
    p=u=1;
    for (int i=1;i<=n;i++)
        f[i].reset();
   // if (mid==3)
     //   printf ("a");
    while (p<=u){
        for (d=0;d<4;d++){
            iv=l[p].first+di[d];
            jv=l[p].second+dj[d];
            if (iv>0 && iv<=n && jv>0 && jv<=m && a[iv][jv]!=1 && f[iv][jv]==0){
                f[iv][jv]=1;
                if (a[iv][jv]==3)
                    return 1;
                if (dd[iv][jv]>=mid){
                    l[++u].first=iv;
                    l[u].second=jv;
                    //if (mid==3)
                      //  printf ("%d %d\n",iv,jv);
                }
            }
        }
        p++;
    }
    return 0;
}
int main()
{
    FILE *fin=fopen ("barbar.in","r");
    FILE *fout=fopen ("barbar.out","w");
    int n,m,nrd,i,j,st,dr,mid,p,u,d,is,js,iv,jv;
    char c;
    fscanf (fin,"%d%d",&n,&m);
    nrd=0;
    for (i=1;i<=n;i++){
        fgetc(fin);
        for (j=1;j<=m;j++){
            dd[i][j]=INF;
            c=fgetc(fin);
            if (c=='.')
                a[i][j]=0;
            else if (c=='*')
                a[i][j]=1;
            else if (c=='D'){
                nrd++;
                a[i][j]=2;
                dd[i][j]=0;
                l[nrd].first=i;
                l[nrd].second=j;
            }
            else if (c=='I'){
                is=i;
                js=j;
            }
            else if (c=='O'){
                a[i][j]=3;
            }
        }
    }
    p=1;
    u=nrd;
    while (p<=u){
        for (d=0;d<4;d++){
            iv=l[p].first+di[d];
            jv=l[p].second+dj[d];
            if (iv>0 && iv<=n && jv>0 && jv<=m && dd[iv][jv]==INF){
                dd[iv][jv]=dd[l[p].first][l[p].second]+1;
                l[++u].first=iv;
                l[u].second=jv;
            }
        }
        p++;
    }
    l[1].first=is;
    l[1].second=js;
    st=1;
    dr=1001;
    while (st<=dr){
        mid=(st+dr)/2;
        if (verif (mid,n,m)==1)
            st=mid+1;
        else dr=mid-1;
    }
    fprintf (fout,"%d",st-1);
    return 0;
}