Cod sursa(job #2299520)

Utilizator DragosArseneDragos Arsene DragosArsene Data 9 decembrie 2018 17:49:28
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <iostream>
#include <stdio.h>
using namespace std;
struct bar{int lin, col;};
int mat[1002][1002], matrice[1002][1002];
bar coada[2000002];
bar dir[4];


int main() {
    FILE *fin, *fout;
    int n, m, i, j, xlee, ylee, xin, yin, xsf, ysf, dragoni=0, front, back, l, c, dr, stg, mijl, steag, steagg=1;
    int inf=2147483647;
    char ch;
fin = fopen("barbar.in", "r");
fout = fopen("barbar.out", "w");

fscanf(fin,"%d%d", &n, &m);
fscanf(fin,"%c", &ch);
for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
        ch=getc(fin);
        if(ch=='.')
            mat[i][j]=inf;
        if(ch=='*')
            mat[i][j]=-1;
        if(ch=='D'){
        coada[++dragoni].lin=i;
        coada[dragoni].col=j;
        }
        if(ch=='I'){
            xin=i;
            yin=j;
            mat[i][j]=-2;
        }
        if(ch=='O'){
            xsf=i;
            ysf=j;
            mat[i][j]=-3;
        }
    }
    c=fgetc(fin);
}

for(i=0;i<=n+1;i++){
    mat[i][0]=-1;
    mat[i][m+1]=-1;
}
for(i=0;i<=m+1;i++){
    mat[0][i]=-1;
    mat[n+1][i]=-1;
}
front=1;
back=dragoni;
dir[0].lin=0;
dir[0].col=1;

dir[1].lin=1;
dir[1].col=0;

dir[2].lin=-1;
dir[2].col=0;

dir[3].lin=0;
dir[3].col=-1;

while(front<=back){
for(i=0;i<=3;i++){
    l=coada[front].lin;
    c=coada[front].col;
    xlee=l+dir[i].lin;
    ylee=c+dir[i].col;
    if(mat[l][c]+1<mat[xlee][ylee]){
        mat[xlee][ylee]=mat[l][c]+1;
        coada[++back].lin=xlee;
        coada[back].col=ylee;
    }
}
front++;
}
for(i=1;i<=dragoni;i++){
    mat[coada[i].lin][coada[i].col]=-1;;
}



stg=1;
dr=n+m+1;
mijl=(dr+stg)/2;
steagg=1;
while(stg<dr){
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            matrice[i][j]=0;
        }
    }

    matrice[xin][yin]=1;
    front=back=1;
    steag=1;
    coada[1].lin=xin;
    coada[1].col=yin;
    while(front<=back){

        for(i=0;i<=3;i++){
            l=coada[front].lin+dir[i].lin;
            c=coada[front].col+dir[i].col;
            if(mat[l][c]>=mijl&&mat[l][c]!=-1&&mat[l][c]!=-2&&matrice[l][c]==0){
                coada[++back].lin=l;
                coada[back].col=c;
                matrice[l][c]=1;
            }
            if(mat[l][c]==-3)
                steag=0;
        }
        front++;
    }

    if(steag==0){
    if(dr-stg==1)
    dr=stg;
    else
    stg=mijl;
    steagg=0;
    }
    else
    dr=mijl;

    mijl=(dr+stg)/2;

}



if(steagg==1)
    fprintf(fout,"-1");
else
    fprintf(fout,"%d", stg);
fclose(fin);
fclose(fout);

    return 0;
}