Cod sursa(job #2191374)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 2 aprilie 2018 18:20:29
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define MAXN 1005
#define MAX 1000000

using namespace std;

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

int n,m,dp[MAXN][MAXN],dragon[MAXN][MAXN],x1,y1,x2,y2;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
bool v[MAXN][MAXN];
queue<pair<int,int> >stiva;
vector<pair<int,int> >dragoni;

void afis(auto v[MAXN][MAXN]){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++)
            cerr<<v[i][j]<<" ";
        cerr<<endl;
    }
}
bool in_matrice(int x,int y){
    if(x >= 1 && x <= n && y >= 1 && y <= m && v[x][y])
        return true;
    return false;
}
void lee_dragon(){
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            dragon[i][j] = MAX;
    for(auto i : dragoni){
        int x = i.first, y = i.second;
        stiva.push({x,y});
        dragon[x][y] = 0;
    }

    int xnou,ynou;
    while(!stiva.empty()){
        int x = stiva.front().first;
        int y = stiva.front().second;
        stiva.pop();
        for(int i = 0; i < 4; i++){
            xnou = x + dx[i];
            ynou = y + dy[i];
            if(in_matrice(xnou,ynou) && dragon[x][y] + 1 < dragon[xnou][ynou]){
                dragon[xnou][ynou] = dragon[x][y] + 1;
                stiva.push({xnou,ynou});
            }
        }
    }

}
bool lee_drum(int x1,int y1,int x2,int y2,int minim){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++)
            dp[i][j] = MAX;
    }
    stiva.push({x1,y1});
    dp[x1][y1] = dragon[x1][y1];

    int xnou,ynou;
    while(!stiva.empty()){
        int x = stiva.front().first;
        int y = stiva.front().second;
        stiva.pop();
        for(int i = 0; i < 4; i++){
            xnou = x + dx[i];
            ynou = y + dy[i];
            if(in_matrice(xnou,ynou) && dragon[xnou][ynou] >= minim &&
               dp[x][y] + dragon[xnou][ynou] < dp[xnou][ynou]){
                dp[xnou][ynou] = dp[x][y] + dragon[x][y];
                stiva.push({xnou,ynou});
            }
        }
    }
    if(dp[x2][y2] >= minim && dp[x2][y2] != MAX)
        return true;
    return false;
}
int cautbin(){
    int pas = 1<<12, r = 0;
    while(pas){
        if(lee_drum(x1,y1,x2,y2,r+pas))
            r += pas;
        pas /= 2;
    }
    if(!r)
        r = -1;
    return r;
}

int main()
{
    in>>n>>m;
    char ch;
    for(int i = 1; i <= n ; i++){
        for(int j = 1; j <= m; j++){
            in>>ch;
            if(ch == 'I'){
                x1 = i,y1 = j;
                v[i][j] = true;
            }else if(ch == 'O'){
                x2 = i,y2 = j;
                v[i][j] = true;
            }else if(ch == 'D'){
                dragoni.push_back(make_pair(i,j));
                v[i][j] = false;
            }else if(ch == '*')
                v[i][j] = false;
            else
                v[i][j] = true;
        }
    }

    lee_dragon();
    out<<cautbin();

    return 0;
}