Cod sursa(job #2646909)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 2 septembrie 2020 13:42:40
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 1005

int n,m,mat2[NMAX][NMAX], lg, cnt;
char mat[NMAX][NMAX];

int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};

pair<int,int> Q[NMAX*NMAX];

struct ceva{
    int x,y,d;
};
ceva Q2[NMAX*NMAX], Q3[NMAX * NMAX];

int sx,sy,fx,fy,lg3;
int OK(int x){
    ++cnt;
    for(int i=1;i<=lg3;i++){
        Q2[i] = Q3[i];
        Q2[i].d = x;
        mat2[Q2[i].x][Q2[i].y] = cnt;
    }
    lg = lg3;

    for (int i=1;i<=lg;i++){
        ceva crt = Q2[i];
        for (int k=0;k<4;k++){
            int X = crt.x + dx[k];
            int Y = crt.y + dy[k];
            if (X <= 0 || X > n || Y <= 0 || Y > m) continue;
            if (mat2[X][Y] == -1 || mat2[X][Y] == cnt) continue;
            mat2[X][Y] = cnt;
            if (crt.d != 1)
                Q2[++lg] = {X,Y,crt.d-1};
        }
    }

    lg = 0;
    Q[++lg] = {sx,sy};
    if (mat2[sx][sy]==-1 || mat2[sx][sy] == cnt || mat2[fx][fy] == -1 || mat2[fx][fy] == cnt) return 0;

    for (int i=1;i<=lg;i++){
        for (int k=0;k<4;k++){
            int X = Q[i].first + dx[k];
            int Y = Q[i].second + dy[k];
            if (X <= 0 || X > n || Y <= 0 || Y > m) continue;
            if (mat2[X][Y] == -1 || mat2[X][Y] == cnt) continue;
            mat2[X][Y] = cnt;
            Q[++lg] = {X,Y};
            if (X == fx && Y == fy){
                return 1;
            }
        }
    }

    return 0;
}

int main()
{
    cin.sync_with_stdio(false);
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    cin >> n >> m;
    for (int i=1;i<=n;i++){
        cin >> mat[i] + 1;
    }

    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            mat2[i][j] = 0;
            if (mat[i][j] == '*')
                mat2[i][j] = -1;
            else if (mat[i][j] == 'I'){
                sx = i;
                sy = j;
            }
            else if (mat[i][j] == 'O'){
                fx = i;
                fy = j;
            }
            else if (mat[i][j] == 'D'){
                Q3[++lg3] = {i,j,0};
            }
        }
    }


    int st = 0, p = 1;
    for (;p<=max(n,m);p<<=1);
    for (;p>=1;p>>=1){
        if(st + p <= max(n,m) && OK(st + p))
            st += p;
    }

    if (!OK(st)){
        cout << -1 << '\n';
    }
    else{
        cout << st+1 << '\n';
    }
    return 0;
}