Cod sursa(job #2210347)

Utilizator giotoPopescu Ioan gioto Data 6 iunie 2018 12:22:22
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
int l1, c1, l2, c2;
int d[1005][1005];
int T[1005][1005];
char s[1005][1005];
short dx[] = {0, 0, -1, 1};
short dy[] = {-1, 1, 0, 0};
queue <pair <int, int> > q;
inline void prec(){
    while(!q.empty()){
        int l = q.front().first, c = q.front().second;
        q.pop();
        for(short k = 0; k < 4 ; ++k){
            int l1 = l + dx[k];
            int c1 = c + dy[k];
            if(!(l1 >= 0 && c1 >= 0 && l1 < n && c1 < m) || s[l1][c1] == '*') continue ;
            if(d[l1][c1] > d[l][c] + 1) {
                d[l1][c1] = d[l][c] + 1;
                q.push({l1, c1});
            }
        }
    }
}
inline void lee(){
    memset(T, -1, sizeof(T));
    q.push({l1, c1});
    T[l1][c1] = d[l1][c1];

    while(!q.empty()){
        int l = q.front().first, c = q.front().second;
        q.pop();
        for(short k = 0; k < 4 ; ++k){
            int l1 = l + dx[k];
            int c1 = c + dy[k];
            if(!(l1 >= 0 && c1 >= 0 && l1 < n && c1 < m) || s[l1][c1] == '*') continue ;
            if(T[l1][c1] < min(T[l][c], d[l1][c1])) {
                T[l1][c1] = min(T[l][c], d[l1][c1]);
                if(l1 == l2 && c1 == c2) continue ;
                q.push({l1, c1});
            }
        }
    }
}
int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    scanf("%d%d", &n, &m);
    memset(d, 0x3f, sizeof(d));
    for(int i = 0; i < n ; ++i){
        scanf("%s", s[i]);
        for(int j = 0; j < m ; ++j){
            if(s[i][j] == 'D') q.push({i, j}), d[i][j] = 0;
            if(s[i][j] == 'I') l1 = i, c1 = j;
            if(s[i][j] == 'O') l2 = i, c2 = j;
        }
    }
    prec();
    lee();
    printf("%d", T[l2][c2]);
    return 0;
}