Cod sursa(job #2033551)

Utilizator KleinWolfPop Dan Andrei KleinWolf Data 6 octombrie 2017 23:20:28
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <deque>
using namespace std;

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

int cost[1001][1001];
bool viz[1001][1001];
queue<pair<int,int> > q;
pair<int,int> pr,ul,x;
int dri[]={0,1,0,-1},drj[]={1,0,-1,0};
int c,r,i,j,v,st,dr,mij;
char a;
int ok()
{
    if(x.first+dri[v]>0 && x.first+dri[v]<=c && x.second+drj[v]>0 && x.second+drj[v]<=r)
        return 1;
    return 0;
}

void reviz()
{
    for(int i=1;i<=c;i++)
        for(int j=1;j<=r;j++)
            viz[i][j]=0;
}

int bfs(int k)
{
    reviz();
    q.push(pr);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        for(v=0;v<4;v++)
        {
            int xi=x.first+dri[v],xj=x.second+drj[v];
            if(!viz[xi][xj] && ok() && cost[xi][xj]>k)
            {
                viz[xi][xj]=1;
                q.push(make_pair(xi,xj));
            }
        }
    }
    return viz[ul.first][ul.second];
}

int main()
{

    in>>c>>r;
    for (i=1;i<=c;i++)
        for(j=1;j<=r;j++)
        {
            in>>a;
            if (a=='D') {cost[i][j]=0; q.push(make_pair(i,j));}
            if (a=='*') cost[i][j]=-1;
            if (a=='I') pr=make_pair(i,j);
            if (a=='O') ul=make_pair(i,j);
        }
    while (!q.empty())
    {
        x=q.front();
        q.pop();
        for(v=0;v<4;v++)
        {
            if(!viz[x.first+dri[v]][x.second+drj[v]] && ok() )
            {
                viz[x.first+dri[v]][x.second+drj[v]]=1;
                cost[x.first+dri[v]][x.second+drj[v]]=cost[x.first][x.second]+1;
                q.push(make_pair(x.first+dri[v],x.second+drj[v]));
            }

        }
    }
    dr=1024;
    st=cost[pr.first][pr.second];
    while (dr-st>1)
    {
        mij=(st+dr)/2;
        if(bfs(mij)) st=mij;
        else dr=mij;
    }
    while(!bfs(mij))mij--;
    while(bfs(mij))mij++;
    out<<mij;
}