Cod sursa(job #1771390)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 5 octombrie 2016 16:24:32
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <cstdio>
#include <deque>
#include <algorithm>
using namespace std;
const int N = 1005;
const int PERETIE = 0;
const int SPATIU = -1;
struct ABC
{
    int i, j, nr;
};
int d[N][N];
int linie[] = {1 , 0 , -1 , 0};
int coloana[] = {0 , 1 , 0 , -1};
deque <ABC> q;

int main()
{
    ABC x;
    int n, m, i, j, iI, jI, iO, jO, nr, k, val = 0;
    char ch;
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n", &n, &m);
    scanf("%c", &ch);
    for(i = 1;i <= n; ++i){
        for(j = 1;j <= m; ++j){
            if(ch == '.'){
                d[i][j] = SPATIU;
            }
            else if(ch == 'I'){
                iI = i;
                jI = j;
                d[i][j] = SPATIU;
            }
            else if(ch == 'O'){
                iO = i;
                jO = j;
                d[i][j] = SPATIU;
            }
            else if(ch == '*'){
                d[i][j] = PERETIE;
            }
            else if(ch == 'D'){
                x.i = i;
                x.j = j;
                x.nr = 0;
                q.push_back(x);
                d[i][j] = PERETIE;
            }
            scanf("%c", &ch);
        }
        scanf("%c", &ch);
    }
    while(!q.empty()){
        i = q.front().i;
        j = q.front().j;
        nr = q.front().nr;
        d[i][j] = nr;
        q.pop_front();
        for(k = 0;k < 4; ++k){
            x.i = i + linie[k];
            x.j = j + coloana[k];
            x.nr = nr + 1;
            if(d[x.i][x.j] == SPATIU){
                d[x.i][x.j] = PERETIE;
                q.push_back(x);
            }
        }
    }
    /*for(i = 1;i <= n; ++i){
        for(j = 1;j <= m; ++j){
            printf("%d ",d[i][j]);
        }
        printf("\n");
    }*/
    x.i = iI;
    x.j = jI;
    x.nr = d[iI][jI];
    d[iI][jI] = 0;
    q.push_back(x);
    do{
        val = q.size();
        i = q.front().i;
        j = q.front().j;
        nr = q.front().nr;
        q.pop_front();
        for(k = 0;k < 4; ++k){
            x.i = i + linie[k];
            x.j = j + coloana[k];
            if(d[x.i][x.j] > 0){
                if(d[x.i][x.j] >= nr){
                    x.nr = nr;
                    q.push_front(x);
                }
                else{
                    x.nr = d[x.i][x.j];
                    q.push_back(x);
                }
                d[x.i][x.j] = -1;
            }
        }
    }while((i != iO || j != jO) && q.size() > 0);
    if(i == iO && j == jO){
        printf("%d\n",nr);
    }
    else{
        printf("-1\n");
    }
    return 0;
}