Cod sursa(job #2835987)

Utilizator lolismekAlex Jerpelea lolismek Data 19 ianuarie 2022 15:59:33
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.38 kb
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
/// BANANA TWIST
#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];
bool reach[N + 1][N + 1], n, m;

/// 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 dfs(pii nod){
    cout << nod.first << " " << nod.second << endl;
    reach[nod.first][nod.second] = true;
    for(int dir = 0; dir < 4; dir++)
        if(!reach[nod.first + diri[dir]][nod.second + dirj[dir]] && in_bounds(nod.first + diri[dir], nod.second + dirj[dir]) && harta[nod.first + diri[dir]][nod.second + dirj[dir]] == LIBER)
            dfs({nod.first + diri[dir], nod.second + dirj[dir]});
}

int main(){
    pii intrare, iesire;
    cout << n << " " << m << endl;
    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);
            cout << 1 << endl;
            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'
    }
    cout << ">>> " << intrare.first << " " << intrare.second << endl;
    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;
                        }
                    }
                }
            }
        }
        cout << " " << intrare.first << " " << intrare.second << endl;
        dfs(intrare);
        if(reach[iesire.first][iesire.second]) ans = dist, dr = dist + 1;
        else st = dist - 1;
    }
    fout << ans;
    return 0;
}