Cod sursa(job #1771733)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 5 octombrie 2016 22:26:30
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1.e3;
struct POZ{
    int x, y;
};
struct BARBAR{
    int x, y, val;
};
deque<BARBAR>d;
int dmin[NMAX + 5][NMAX + 5];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int main(){
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    int r, c, i, j;
    char car;
    POZ begin, end;
    BARBAR n1, n2;
    scanf("%d %d", &r, &c);
    for (i = 1; i <= r; i ++){
        getc(stdin);
        for (j = 1; j <= c; j ++){
            car = getc(stdin);
            switch (car){
                case 'I': {dmin[i][j] = -1; begin.x = i; begin.y = j; break;}
                case 'O': {dmin[i][j] = -1; end.x = i; end.y = j; break;}
                case 'D': {n1.x = i; n1.y = j; n1.val = 0; d.push_back(n1); break;}
                case '.': {dmin[i][j] = -1; break;}
            }
        }
    }
    do{
        n1 = d.front();
        d.pop_front();
        dmin[n1.x][n1.y] = n1.val;
        for (i = 0; i < 4; i ++){
            n2.x = n1.x + dx[i];
            n2.y = n1.y + dy[i];
            n2.val = n1.val + 1;
            if (dmin[n2.x][n2.y] == -1){
                dmin[n2.x][n2.y] = 0;
                d.push_back(n2);
            }
        }
    }while(d.size());
    n1.x = begin.x;
    n1.y = begin.y;
    n1.val = dmin[begin.x][begin.y];
    d.push_back(n1);
    do{
        n1 = d.front();
        d.pop_front();
        for (i = 0; i < 4; i ++){
            n2.x = n1.x + dx[i];
            n2.y = n1.y + dy[i];
            if (dmin[n2.x][n2.y] > 0){
                if (dmin[n2.x][n2.y] >= n1.val){
                    n2.val = n1.val;
                    d.push_front(n2);
                }else{
                    n2.val = dmin[n2.x][n2.y];
                    d.push_back(n2);
                }
            }
            dmin[n2.x][n2.y] = -1;
        }
    }while((n1.x != end.x || n1.y != end.y) && d.size() > 0);
    if (n1.x == end.x && n1.y == end.y)
        printf("%d\n", n1.val);
    else
        printf("-1\n");
    return 0;
}