Cod sursa(job #1537796)

Utilizator OpportunityVlad Negura Opportunity Data 28 noiembrie 2015 01:31:00
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <set>
using namespace std;
#define pb push_back
#define mp make_pair
#define fs first
#define sc second

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

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

int n,m,a[1001][1001],isDragon[1001][1001], rs = 2000;
char ch;
pair<int,int> start,finish;
deque< pair<int,int> > q;
set< pair<int, pair<int,int> > > s;


inline bool inside(int x, int y) {
    return (x >= 0 && x < n && y >= 0 && y < m);
}

int main() {

    fi >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            fi >> ch;
            switch (ch) {
                case 'I':
                    start.fs = i;
                    start.sc = j;
                    break;
                case 'O':
                    finish.fs = i;
                    finish.sc = j;
                    break;
                case 'D':
                    q.pb(mp(i,j));
                    isDragon[i][j] = 1;
                    break;
                case '*':
                    a[i][j] = -1;
                    break;
                default:
                    break;
            }
        }
    }

    while (!q.empty()) {
        pair<int,int> aux = q.front();
        q.pop_front();
        for (int i=0; i<4; i++) {
            int newx = aux.fs + dx[i];
            int newy = aux.sc + dy[i];
            if (inside(newx, newy) && !isDragon[newx][newy] && a[newx][newy] == 0) {
                a[newx][newy] = a[aux.fs][aux.sc]+1;
                q.pb(mp(newx, newy));
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cout << a[i][j] << ' ';
        }
        cout << endl;
    }

    s.insert(mp(a[start.fs][start.sc], mp(start.fs, start.sc)));
    a[start.fs][start.sc] = -2;

    while (!s.empty()) {
        pair<int, pair<int,int>> aux = (*s.rbegin());
        s.erase(*s.rbegin());
        rs = min(rs, aux.fs);

        if (aux.sc.fs == finish.fs && aux.sc.sc == finish.sc) {
            cout << rs;
            return 0;
        }

        for (int i = 0; i < 4; ++i) {
            int nx = aux.sc.fs + dx[i];
            int ny = aux.sc.sc + dy[i];
            if (inside(nx,ny) && a[nx][ny] > 0) {
                s.insert(mp(a[nx][ny],mp(nx,ny)));
                a[nx][ny] = -2;
            }
        }
    }

    cout << -1;

    return 0;
}