Cod sursa(job #2335674)

Utilizator anamariatoaderAna Toader anamariatoader Data 4 februarie 2019 13:50:00
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n,m,i,j,u,st,dr,mij,sol,li,ci;
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
short int v[1005][1005],d[1005][1005];
bool viz[1005][1005];
char c;
struct numar{
    int l,c;
}q[1000100];

void dragoni(){
    int p=1,r,l,c,lnou,cnou;
    while(p<=u){
        l=q[p].l;
        c=q[p].c;
        for(r=1;r<=4;r++){
            lnou=l+dx[r];
            cnou=c+dy[r];
            if(v[lnou][cnou]>0){
                if(viz[lnou][cnou]==0){
                    viz[lnou][cnou]=1;
                    q[++u].l=lnou;
                    q[u].c=cnou;
                    d[lnou][cnou]=d[l][c]+1;
                }
                else if(d[lnou][cnou]>d[l][c]+1){
                    d[lnou][cnou]=d[l][c]+1;
                    q[++u].l=lnou;
                    q[u].c=cnou;
                }
            }
        }
        p++;
    }
}

int coada(int D){
    int p,u,r,l,c,lnou,cnou;
    memset(viz,0,sizeof(viz));
    p=u=1;
    q[p].l=li;
    q[p].c=ci;
    viz[li][ci]=1;
    while(p<=u){
        l=q[p].l;
        c=q[p].c;
        for(r=1;r<=4;r++){
            lnou=l+dx[r];
            cnou=c+dy[r];
            if(v[lnou][cnou]>0 && viz[lnou][cnou]==0 && d[lnou][cnou]>=D){
                q[++u].l=lnou;
                q[u].c=cnou;
                viz[lnou][cnou]=1;
                if(v[lnou][cnou]==3)
                    return 1;
            }
        }
        p++;
    }
    return 0;
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++){
         fin>>c;
         if(c=='.')
            v[i][j]=1;
         else if(c=='I'){
            v[i][j]=2;
            li=i; ci=j;
         }
         else if(c=='O')
            v[i][j]=3;
         else if(c=='D'){
            q[++u].l=i;
            q[u].c=j;
         }
      }
    dragoni();
    st=1; dr=1000000;
    sol=-1;
    while(st<=dr){
        mij=(st+dr)/2;
        if(coada(mij)==1){
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    fout<<sol;
    return 0;
}