Cod sursa(job #2219942)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 10 iulie 2018 02:06:08
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <fstream>
#include <queue>
#include <limits.h>

using namespace std;

ifstream fin ("barbar.in");
ofstream fout ("barbar.out");

const int INF = INT_MAX;

int mat[1005][1005], d[1005][1005];
int r, c, i, j, startx, starty, stopx, stopy, dir;

int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0 ,0};

char v[1005][1005];

queue < pair <int, int> > Q;

bool isOk(int i, int j)
{
    return (i >= 1 && i <= r && j >= 1 && j <= c && v[i][j] != '*');
}

void Lee1()
{
    int i, j, i2, j2;
    while (!Q.empty()){
        i = Q.front().first;
        j = Q.front().second;
        for (dir=0; dir<4; dir++){
            i2 = i + di[dir];
            j2 = j + dj[dir];
            if (isOk(i2, j2) && d[i2][j2] > d[i][j] + 1){
                d[i2][j2] = d[i][j] + 1;
                Q.push(make_pair(i2, j2));
            }
        }
        Q.pop();
    }
}

void Lee2()
{
    int i, j, i2, j2;
    while (!Q.empty()){
        i = Q.front().first;
        j = Q.front().second;
        for (dir=0; dir<4; dir++){
            i2 = i + di[dir];
            j2 = j + dj[dir];
            if (isOk(i2, j2)){
                if (mat[i2][j2] == -1){
                    mat[i2][j2] = min(mat[i][j], d[i2][j2]);
                    Q.push(make_pair(i2, j2));
                }
                else if (mat[i2][j2] < min(mat[i][j], d[i2][j2])){
                    mat[i2][j2] = min(mat[i][j], d[i2][j2]);
                    Q.push(make_pair(i2, j2));
                }
            }
        }
        Q.pop();
    }
}

int main()
{
    fin >> r >> c;
    for (i=1; i<=r; i++){
        for (j=1; j<=c; j++){
            fin >> v[i][j];
            if (v[i][j] == 'D'){
                Q.push(make_pair(i, j));
                d[i][j] = 0;
            }
            else {
                if (v[i][j] == 'I'){
                    startx = i;
                    starty = j;
                }
                if (v[i][j] == 'O'){
                    stopx == i;
                    stopy == j;
                }
                d[i][j] = INF;
            }
        }
    }
    //Lee1();
    while (!Q.empty()){
        i = Q.front().first;
        j = Q.front().second;
        for (dir=0; dir<4; dir++){
            int i2 = i + di[dir];
            int j2 = j + dj[dir];
            if (isOk(i2, j2) && d[i2][j2] > d[i][j] + 1){
                d[i2][j2] = d[i][j] + 1;
                Q.push(make_pair(i2, j2));
            }
        }
        Q.pop();
    }
    for (i=1; i<=r; i++)
        for (j=1; j<=c; j++)
            mat[i][j] = -1;
    Q.push(make_pair(startx, starty));
    mat[startx][starty] = d[startx][starty];
    //ee2();
    while (!Q.empty()){
        i = Q.front().first;
        j = Q.front().second;
        for (dir=0; dir<4; dir++){
            int i2 = i + di[dir];
            int j2 = j + dj[dir];
            if (isOk(i2, j2)){
                if (mat[i2][j2] == -1){
                    mat[i2][j2] = min(mat[i][j], d[i2][j2]);
                    Q.push(make_pair(i2, j2));
                }
                else if (mat[i2][j2] < min(mat[i][j], d[i2][j2])){
                    mat[i2][j2] = min(mat[i][j], d[i2][j2]);
                    Q.push(make_pair(i2, j2));
                }
            }
        }
        Q.pop();
    }
    fout << mat[stopx][stopy];
    return 0;
}