Cod sursa(job #2334011)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 2 februarie 2019 10:21:58
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <cstring>
using namespace std;
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1},n,m,ci,li,lf,cf,i,k,sol,q[2][1000003],b[1003][1003];
bool viz[1003][1003];
int a[1003][1003],j,u,st,dr,x;
char ch;
ifstream f("barbar.in");
ofstream g("barbar.out");
void coada(){
    int l,c,ln,cn,p,u,i;
    p=1;
    while(p<=u){
        l=q[0][p];
        c=q[1][p];
        p++;
        for(i=1;i<=4;i++){
            ln=l+dx[i];
            cn=c+dy[i];
            if(a[ln][cn]==0&&b[ln][cn]==0){
                b[ln][cn]=b[l][c]+1;
                u++;
                q[0][u]=ln;
                q[1][u]=cn;
            }
        }
    }
}
int coada1(int x,int y,int d){
int p,u,l,c,ln,cn,i;
p=1;u=1;
    memset(viz,0,sizeof(viz));
    if(b[x][y]<d)
        return 0;
    q[0][p]=x;
    q[1][p]=y;
    viz[x][y]=1;
    while(p<=u&&viz[lf][cf]==0){
        l=q[0][p];
        c=q[1][p];
        p++;
        for(i=1;i<=4;i++){
            ln=l+dx[i];
            cn=c+dy[i];
            if(a[ln][cn]==0&&b[ln][cn]>=d&&viz[ln][cn]==0){
                u++;
                q[0][u]=ln;
                q[1][u]=cn;
                viz[ln][cn]=1;
            }
        }
    }


    return viz[lf][cf]==1;
}
int main()
{   u=0;
    f>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            f>>ch;
            if(ch=='.')
                a[i][j]=0;
            else
                if(ch=='*')
                    a[i][j]=2;
            else
                if(ch=='D'){
                    a[i][j]=1;
                    u++;
                    q[0][u]=i;
                    q[1][u]=j;

                    }
            else
                if(ch=='I'){
                    a[i][j]=1;
                    li=i;
                    ci=j;
                }
            else{
                a[i][j]=0;
                lf=i;
                cf=j;
            }
        }
    for(i=0;i<=n+1;i++){
        a[i][0]=2;
        a[i][m+1]=2;
    }
    for(j=0;i<=m+1;j++){
        a[0][j]=2;
        a[n+1][j]=2;
    }

    coada();
    sol=-1;
    st=1;dr=max(n,m);
    while(st<=dr){
        x=(st+dr)/2;
        k=coada1(li,ci,x);
        if(k==1){
            sol=x;
            st=x+1;
        }
        else
            dr=x-1;
    }
    g<<sol;
    return 0;
}