Cod sursa(job #1603073)

Utilizator andreiskiorAndrei Cristian Nastase andreiskior Data 17 februarie 2016 10:02:59
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <stdio.h>
#include <queue>

int dx[4] = {1,0,0,-1};
int dy[4] = {0,1,-1,0};

using std::queue;
using std::pair;
using std::make_pair;

queue < pair < int,int > > Q;

int n,m,dir;
int temnita[1000][1000];
int tf[1000][1000];

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    char s[1000];
    int i,j,ic,jc,sol = 0;
    pair <int,int> _start;
    pair <int, int> _end;
    int st = 0,dr = 0, mij;
    scanf("%d %d",&n,&m);
    for(i = 0; i < n; ++i)
    {
        scanf("%s",s);
        for(j = 0; j < m; ++j)
        {
            if(s[j] == '*')
                temnita[i][j] = -1;
            else
                if(s[j] == 'D')
                    Q.push(make_pair(i,j));
                else
                    if(s[j] == 'I'){
                        temnita[i][j] = -2;
                        _start.first = i;
                        _start.second = j;
                    }
                    else
                        if(s[j] == 'O'){
                            _end.first = i;
                            _end.second = j;
                        }
        }
    }
    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(dir = 0; dir < 4; ++dir)
        {
            ic = i + dx[dir];
            jc = j + dy[dir];
            if(ic >= 0 && jc >= 0 && ic < n && jc < m)
                if(temnita[ic][jc] == 0){
                    if(dr < temnita[i][j] + 1)
                        dr = temnita[i][j] + 1;
                    temnita[ic][jc] = temnita[i][j] + 1;
                    Q.push(make_pair(ic,jc));
                }
        }

    }
    sol = dr;
    while(st <= dr)
    {
        Q.push(make_pair(_start.first,_start.second));
        mij = (st + dr) / 2;
        while(!Q.empty())
        {
            i = Q.front().first;
            j = Q.front().second;
            Q.pop();
            for(dir = 0; dir < 4; ++dir)
            {
                ic = i + dx[dir];
                jc = j + dy[dir];
                if(ic >= 0 && jc >= 0 && ic < n && jc < m){
                    if(tf[ic][jc] == 0 && temnita[ic][jc] >= mij)
                    {
                        tf[ic][jc] = tf[i][j] + 1;
                        Q.push(make_pair(ic,jc));
                    }
                }
            }
        }
        if(tf[_end.first][_end.second] != 0)
        {
            sol = mij;
            st = mij + 1;
        }
        else
            dr = mij - 1;
        for(i = 0; i < n; ++i)
            for(j = 0; j < m; ++j)
                tf[i][j] = 0;
    }
    printf("0\n",sol);
    return 0;
}