Cod sursa(job #2836128)

Utilizator lolismekAlex Jerpelea lolismek Data 19 ianuarie 2022 19:55:46
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb

#include <iostream>
#include <fstream>
#include <queue>

#define pii pair <int, int>
#define LIBER 0
#define PERETE 1
#define DRAGON 2

using namespace std;

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

const int N = 1000;
int original[N + 1][N + 1], harta[N + 1][N + 1], n, m;
bool reach[N + 1][N + 1];

/// ordine N, E, S, V:
int diri[] = {-1, 0, 1, 0};
int dirj[] = {0, 1, 0, -1};

void clear_harta(){
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
            reach[i][j] = harta[i][j] = 0;
}

bool in_bounds(int i, int j){
    return (1 <= i && i <= n && 1 <= j && j <= m);
}

void my_fill(pii nod){
    reach[nod.first][nod.second] = true;
    for(int dir = 0; dir < 4; dir++){
        if(!reach[nod.first + diri[dir]][nod.second + dirj[dir]] && harta[nod.first + diri[dir]][nod.second + dirj[dir]] == LIBER && in_bounds(nod.first + diri[dir], nod.second + dirj[dir]))
            my_fill({nod.first + diri[dir] ,nod.second + dirj[dir]});
    }
}

int main(){
    pii intrare, iesire;
    fin >> n >> m;
    char ch;
    fin.get(ch); /// '\n'
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            fin.get(ch);
            if(ch == 'I') intrare = {i, j};
            if(ch == 'O') iesire = {i, j};
            if(ch == 'D') original[i][j] = DRAGON;
            if(ch == '*') original[i][j] = PERETE;
        }
        fin.get(ch); /// '\n'
    }
    int st = 0, dr = N, ans = -1;
    while(st <= dr){
        clear_harta();
        int dist = (st + dr) / 2;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                harta[i][j] = original[i][j];
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                if(original[i][j] == DRAGON){
                    for(int dir = 0; dir < 4; dir++){
                        int x = i, y = j;
                        for(int k = 0; k < dist; k++){
                            x += diri[dir];
                            y += dirj[dir];
                            if(in_bounds(x, y) && original[x][y] == LIBER) harta[x][y] = PERETE;
                        }
                    }
                }
            }
        }
        my_fill(intrare);
        /*cout << ">> " << dist << endl;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++)
                cout << harta[i][j] << " ";
            cout << endl;
        }
        cout << endl;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++)
                cout << reach[i][j] << " ";
            cout << endl;
        }**/
        if(reach[iesire.first][iesire.second]) ans = dist, st = dist + 1;
        else dr = dist - 1;
    }
    fout << ans + 1;
    return 0;
}