Cod sursa(job #1175141)

Utilizator alexiaambrusAlexia Ambrus alexiaambrus Data 24 aprilie 2014 15:33:46
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>
#include <vector>
#include <string>
#include <string.h>
#include <queue>

using namespace std;
typedef pair<int, int> pii;
const int Nmax = 1005;
const int INF = 0x3f3f3f3f;

int sx, sy, fx, fy;
int bd[Nmax][Nmax];
char viz[Nmax][Nmax];
int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0};


int main()
{
    ifstream f ("barbar.in");
    ofstream g ("barbar.out");

    int R, C;
    string row;
    f >> R >> C;
    memset(bd, INF, sizeof(bd));
    memset(viz, 0, sizeof(viz));
    queue<pii> Q;
    for (int i = 0; i < R; i++)
    {
        f >> row;
        for (int j = 0; j < row.size(); j++)
        {
            if (row[j] == 'I') { sx = i; sy = j; }
            if (row[j] == 'O') { fx = i; fy = j; }
            if (row[j] == 'D') { bd[i][j] = 0; Q.push(make_pair(i,j)); }
            if (row[j] == '*') bd[i][j] = -1;
        }
    }

    while(!Q.empty())
    {
        pii P = Q.front(); Q.pop();
        for (int dir = 0; dir < 4; dir++)
        {
            int nx = P.first + dx[dir];
            int ny = P.second + dy[dir];
            if (nx >= 0 && nx < R &&
                ny >= 0 && ny < C && bd[nx][ny] != -1)
            {
                if (bd[nx][ny] > bd[P.first][P.second] + 1)
                {
                    bd[nx][ny] = bd[P.first][P.second] + 1;
                    Q.push(make_pair(nx, ny));
                }
            }
        }
    }

    int current;
    queue<pii> q1;
    q1.push(make_pair(sx, sy));
    current = bd[sx][sy];
    bool done = false;
    while(!q1.empty() && current >= 0 && !done)
    {
        queue<pii> q2;
        while(!q1.empty())
        {
            pii P = q1.front(); q1.pop();
            if (P.first == fx && P.second == fy)
            {
                g << current << '\n';
                q2 = queue<pii>();
                done = true;
                break;
            }
            for(int dir = 0; dir < 4; dir++)
            {
                int nx = P.first + dx[dir];
                int ny = P.second + dy[dir];
                if (nx >= 0 && nx < R &&
                    ny >= 0 && ny < C &&
                    bd[nx][ny] != -1 && !viz[nx][ny])
                {
                    if (bd[nx][ny] >= current) q1.push(make_pair(nx, ny));
                    else q2.push(make_pair(nx, ny));
                    viz[nx][ny] = 1;
                }
            }
        }
        q1 = q2;
        current--;
    }
    if (!done) g << -1 << '\n';

    return 0;
}