Cod sursa(job #1024997)

Utilizator chimistuFMI Stirb Andrei chimistu Data 9 noiembrie 2013 13:29:52
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <queue>
#define maxn 1000

using namespace std;

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

int mat[maxn][maxn],mat2[maxn][maxn];
int n,m;
pair<int, int> start,sfarsit;
int Ox[] = {1,0,-1,0};
int Oy[] = {0,1,0,-1};

void bf(vector <pair<int,int> > &dragon){
    queue<pair <int,int> > q;
    pair<int,int> elem;
    int linie,coloana;

    for(unsigned int i=0;i<dragon.size();i++)
        q.push(dragon[i]);
    while(!q.empty()){
        elem = q.front();
        q.pop();
        for(int i=0;i<4;i++){
            linie = elem.first+Ox[i];
            coloana = elem.second + Oy[i];
            if(linie>=0 && linie<n && coloana>=0 && coloana<m)
                if(mat[linie][coloana]==0){
                    mat[linie][coloana] = mat[elem.first][elem.second] + 1;
                    q.push(make_pair(linie,coloana));
                }
        }
    }
}

bool valid(int val){
    queue<pair <int,int> > q;
    pair<int,int> elem;
    int linie,coloana;
    if(mat[start.first][start.second] < val)
        return false;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            mat2[i][j] = mat[i][j];
    q.push(start);
    mat2[start.first][start.second] = -1;
    while (!q.empty()){
        elem = q.front();
        q.pop();
        for(int i=0;i<4;i++){
            linie = elem.first + Ox[i];
            coloana = elem.second + Oy[i];
            if(linie>=0 && linie<n && coloana>=0 && coloana<m)
                if(mat2[linie][coloana] > val){
                    mat2[linie][coloana] = 1;
                    q.push(make_pair(linie,coloana));
                    if(linie==sfarsit.first && coloana ==sfarsit.second)
                        return true;
                }
        }
    }
    return false;
}


int main()
{
    char x;
    vector <pair<int,int> > dragon;
    f >> n >> m;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            f >> x;
            if(x=='.'){
                mat[i][j]=0;
            }
            if(x=='D'){
                mat[i][j]=1;
                dragon.push_back(make_pair(i,j));
            }
            if(x=='I'){
                start = make_pair(i,j);
            }
            if(x=='O'){
                sfarsit = make_pair(i,j);
            }
            if(x=='*'){
                mat[i][j]=1;
            }
        }
    bf(dragon);

    int st,dr,mij,rez;
    rez=0;
    st=1;
    dr=max(n,m);
    while(st<=dr){
        mij=(st+dr)/2;
        if(valid(mij)){
            rez = mij;
            st = mij+1;
        }
        else
            dr = mij-1;
    }
    if(rez)
        g << rez;
    else
        g << "-1";
    return 0;
}