Cod sursa(job #2094586)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 26 decembrie 2017 11:10:45
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N = 1002, dx[] = {-1,0,1,0}, dy[] = {0,1,0,-1};
int mat[N][N];
short int n, m, cx[N*N], cy[N*N], xf, yf, xi, yi;
bool viz[N][N];
bool bun(int i, int j){
    return (i > 0 && j > 0 && i <= n && j <= m);
}
void sterg(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            viz[i][j] = false;
}
int BFS(int nr){
    int st = 1, dr = nr, k, xc, yc, Max = 0;
    while(st <= dr){
        for(k=0;k<4;k++){
            xc = cx[st] + dx[k];
            yc = cy[st] + dy[k];
            if(bun(xc,yc) && mat[xc][yc] == 0){
                mat[xc][yc] = mat[cx[st]][cy[st]] + 1;
                Max = max(Max, mat[xc][yc]);
                cx[++dr] = xc;
                cy[dr] = yc;
            }
        }
        st++;
    }
    return Max;
}
bool BFS2(int dMax){
    if(mat[xi][yi] <= dMax)
        return false;
    int st = 1, dr = 1, k, xc, yc;
    sterg();
    cx[1] = xi;
    cy[1] = yi;
    viz[xi][yi] = true;
    while(st <= dr){
        for(k=0;k<4;k++){
            xc = cx[st] + dx[k];
            yc = cy[st] + dy[k];
            if(bun(xc,yc) && viz[xc][yc] == false && mat[xc][yc] > 1 && mat[xc][yc] > dMax){
                viz[xc][yc] = true;
                cx[++dr] = xc;
                cy[dr] = yc;
            }
        }
        st++;
    }
    return viz[xf][yf];
}
int solve(int Max){
    int step = 1, dist;
    for(;step < Max;step<<=1);
    for(dist=0;step;step>>=1)
        if(BFS2(dist + step))
            dist += step;
    return dist;
}
int main()
{
    int dr = 0, Max, r;
    char x;
    in>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            in>>x;
            if(x == 'I'){
                xi = i;
                yi = j;
            }
            else if(x == 'O'){
                xf = i;
                yf = j;
            }
            else if(x == '*')
                mat[i][j] = -1;
            else if(x == 'D'){
                mat[i][j] = 1;
                cx[++dr] = i;
                cy[dr] = j;
            }
        }
    in.close();
    Max = BFS(dr);
    if(mat[xf][yf] == 0)
        out<<"-1\n";
    else{
        r = solve(Max);
        if(r == 0)
            out<<"-1\n";
        else
            out<<r<<"\n";
    }
    out.close();
    return 0;
}