Cod sursa(job #2005310)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 26 iulie 2017 18:01:26
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <cstdio>
#include <queue>
#include <iostream>

using namespace std;

const int NMAX = 1000;

char v[1+NMAX+3][1+NMAX+3];

int a[1+NMAX][1+NMAX];

int r,c;

const int iplus[4] = {0,0,-1,1};
const int jplus[4] = {1,-1,0,0};

struct square
{
    int x,y;
};

bool operator<(const square &c,const square &b)
{
    return a[c.x][c.y] < a[b.x][b.y];
}


priority_queue <square> h;

queue <square> q;

square start,finish;

void makecost()
{
    for(int i = 1;i <= r;i ++)
    {
        for(int j = 1;j <= c;j ++)
        {
            if(v[i][j] == 'D')
                q.push({i,j});
            if(v[i][j] == 'I')
            {
                start = {i,j};
                v[i][j] = '.';
            }
            if(v[i][j] == 'O')
            {
                finish = {i,j};
                v[i][j] = '.';
            }
        }
    }
    while(q.size() > 0)
    {
        square s = q.front();
        q.pop();
        for(int dir = 0;dir < 4;dir ++)
        {
            int x = s.x + iplus[dir];
            int y = s.y + jplus[dir];
            if(v[x][y] == '.' && a[x][y] == 0)
            {
                a[x][y] = a[s.x][s.y] + 1;
                q.push({x,y});
            }
        }
    }

}

bool check[1+NMAX][1+NMAX];

bool drum(int t){
    for(int i = 1;i <= r;i ++)
        for(int j = 1;j <= c;j ++)
            check[i][j] = 0;
    while(q.size() > 0)
        q.pop();
    if(t == 2)
        {
            t ++;
            t --;
        }
    q.push(start);
    while(q.size() > 0){
        square s = q.front();
        q.pop();
        for(int dir = 0;dir < 4;dir ++)
        {
            int x = s.x + iplus[dir];
            int y = s.y + jplus[dir];
            if(x == finish.x && y == finish.y)
                return 1;
            if((v[x][y] == '.' || v[x][y] == 'D') && check[x][y] == 0 && a[x][y] >= t)
            {
                check[x][y] = 1;
                q.push({x,y});
            }
        }
    }
    return 0;
}

int cautbin()
{
    int r = 0,pas = 1 << 19;
    while(pas)
    {
        if(pas == 2)
        {
            pas ++;
            pas --;
        }
        if(drum(r+pas) == 1)
            r += pas;
        pas >>= 1;
    }
    return r;
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d %d\n",&r,&c);
    for(int i = 1;i <= r;i ++)
    {
        fgets(v[i]+1,NMAX+3,stdin);
        //fputs(v[i],stdout);
    }
    makecost();
    printf("%d",cautbin());
    return 0;
}