Cod sursa(job #2161231)

Utilizator KemyKoTeo Virghi KemyKo Data 11 martie 2018 16:15:14
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int INF = 0x3f3f3f3f;
struct cell{
    int val, mini;
    bool obj;

    cell(){                     //0->Nothin, 1->Obstacle
        obj  = false;
        val = INF;
        mini = -INF;
    }
};

int n, m;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
vector < vector< cell > > lab;  //Matrice
queue < pair<int, int> > Q;     //Dragonii + Walker
pair <int, int> S, F;           //Start Finish

bool okGrid(int i, int j)
{
    return (i>=0 && i<n && j>=0 && j<m);
}

int main()
{
    int i, j, dir, x, y;
    char c;

    f>>n>>m;            //Citire
    for(i=1;i<=n;++i){
        vector <cell> aux;

        for(j=1;j<=m;++j){
            cell x;

            f>>c;
            if(c=='*' || c=='D' || c=='I') x.obj = true;

            if(c=='I') {
                S = make_pair(i - 1, j - 1);
                x.val = INF;
            }
            else if(c=='O') F = make_pair(i - 1, j - 1);
            else if(c=='D') {
                Q.push(make_pair(i - 1, j - 1));
                x.val = 0;
            }

            aux.push_back(x);
        }

        lab.push_back(aux);
        f.get();         //EOL
    }

    while(!Q.empty()){                      //Dragoni
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();

        for(dir=0;dir<4;++dir){
            x = i + dx[dir];
            y = j + dy[dir];

            if(okGrid(x, y) && !lab[x][y].obj && lab[x][y].val > lab[i][j].val + 1){
                lab[x][y].val = lab[i][j].val + 1;
                Q.push(make_pair(x, y));
            }
        }

    }

    Q.push(make_pair(S.first, S.second));   //MaxMinDist
    lab[S.first][S.second].mini = lab[S.first][S.second].val;
    while(!Q.empty()){
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();

        for(dir=0;dir<4;++dir){
            x = i + dx[dir];
            y = j + dy[dir];

            if(okGrid(x, y) && !lab[x][y].obj && lab[x][y].mini < min(lab[x][y].val, lab[i][j].mini)){
                lab[x][y].mini = min(lab[x][y].val, lab[i][j].mini);
                Q.push(make_pair(x, y));
            }
        }
    }

    g<<lab[F.first][F.second].mini;
    return 0;
}