Cod sursa(job #2641308)

Utilizator GiosinioGeorge Giosan Giosinio Data 10 august 2020 22:42:41
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <iostream>
#include <fstream>
#define DIM 1005

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

struct punct{
    short ox, oy;
}coada[DIM*DIM],pp,ps;

short R,C, dmin[DIM][DIM];
bool a[DIM][DIM], copie[DIM][DIM];

const int kx[] = {-1,0,1,0};
const int ky[] = {0,1,0,-1};

void initializare(short a[][DIM], int n, int m){
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            a[i][j] = 2*DIM;
}

void bordare(bool a[][DIM], int n, int m){
    for(int i=0; i<=m+1; i++)
        a[0][i] = a[n+1][i] = 1;
    for(int i=0; i<=n+1; i++)
        a[i][0] = a[i][m+1] = 1;
}

void copiere_matrice(int n, int m, bool a[][DIM], bool copie[][DIM]){
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            a[i][j] = copie[i][j];
}

void Dragon_Blast(int i, int j){
    dmin[i][j] = 0;
    int inc=0,sf=0;
    coada[inc].ox = i, coada[inc].oy = j;
    while(inc <=sf){
        punct p = coada[inc];
        for(int i=0; i<4; i++)
            if(dmin[p.ox + kx[i]][p.oy + ky[i]] > dmin[p.ox][p.oy] + 1){
                dmin[p.ox + kx[i]][p.oy + ky[i]] = dmin[p.ox][p.oy] + 1;
                coada[++sf].ox = p.ox + kx[i];
                coada[sf].oy = p.oy + ky[i];
            }
        inc++;
    }
}

void citire(short n, short m, bool a[][DIM]){
    bordare(a,n,m);
    char c;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++){
            f>>c;
            if(c == '.')
                a[i][j] = 0;
            if(c == '*')
                a[i][j] = 1;
            if(c == 'I')
                pp.ox = i, pp.oy=j;
            if(c == 'O')
                ps.ox = i, ps.oy =j;
            if(c == 'D')
                Dragon_Blast(i,j);
        }
    copiere_matrice(n,m,copie,a);
}

bool Lee(bool a[][DIM],int sup){
    int inc=0, sf=0;
    coada[inc] = pp;
    a[pp.ox][pp.oy] = 1;
    while(inc <= sf && a[ps.ox][ps.oy] == 0){
        punct p = coada[inc];
        for(int i=0; i<4; i++)
            if(a[p.ox + kx[i]][p.oy + ky[i]] == 0 && dmin[p.ox + kx[i]][p.oy + ky[i]] >= sup){
                a[p.ox + kx[i]][p.oy + ky[i]] = 1;
                coada[++sf].ox = p.ox + kx[i];
                coada[sf].oy = p.oy + ky[i];
            }
        inc++;
    }
    return a[ps.ox][ps.oy];
}

void solve(){
    int st = 1, dr = R+C;
    while(st != dr){
        int mij = (st + dr)/2;
        if(Lee(a,mij) == 1)
            st = mij;
        else
            dr = mij-1;
        copiere_matrice(R,C,a,copie);
    }
    if(Lee(a,st))
        g<<st;
    else
        g<<-1;
}

int main()
{
    f>>R>>C;
    initializare(dmin,R,C);
    citire(R,C,a);
    dmin[ps.ox][ps.oy] = R+C;
    solve();
}