Cod sursa(job #2033590)

Utilizator GramaDavidGrama David Sebastian GramaDavid Data 7 octombrie 2017 00:48:51
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

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

queue<pair<int,int> > q;
pair<int,int> start,esire,x;

int dri[4]={0,1,0,-1};
int drj[4]={1,0,-1,0};

int C,R,i,j,st,dr,D,mid,cost[100][100],viz[100][100];
char n;
int ok(int a,int b)
{
    if(a>0 && a<=C && b>0 && b<=R){
        return 1;
    }
    return 0;
}

void reset()
{
    for(int i=1;i<=C;i=i+1)
        for(int j=1;j<=R;j=j+1)
            viz[i][j]=0;
}

int lee(int s)
{
    int xi,xj;
    reset();
    q.push(start);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        for(D=0;D<4;D++)
        {
            xi=x.first+dri[D];
            xj=x.second+drj[D];
            if(viz[xi][xj]==0 && ok(xi,xj) && cost[xi][xj]>s)
            {
                q.push(make_pair(xi,xj));
                viz[xi][xj]=1;
            }
        }
    }
    return viz[esire.first][esire.second];
}

int main()
{

    f>>C>>R;
    for (i=1;i<=C;i=i+1)
        for(j=1;j<=R;j=j+1)
        {
            f>>n;
            if (n=='D') {
                viz[i][j]=-1;
                q.push(make_pair(i,j));
            }
            if (n=='*'){
                viz[i][j]=-1;
            }
            if (n=='I'){
                start=make_pair(i,j);
            }
            if (n=='O'){
                esire=make_pair(i,j);
            }
        }
    while (!q.empty())
    {
        x=q.front();
        q.pop();
        for(D=0;D<4;D++)
        {
            int xi=x.first+dri[D];
            int xj=x.second+drj[D];
            if(viz[xi][xj]==0 && ok(xi,xj) )
            {
                viz[xi][xj]=1;
                cost[xi][xj]=cost[x.first][x.second]+1;
                q.push(make_pair(xi,xj));
            }

        }
    }
    dr=4000;
    st=cost[start.first][start.second];
    while (dr-st>=1)
    {
        mid=(st+dr)/2;
        if(lee(mid)){
            st=mid;
        }
        else {
            dr=mid;
        }
    }
    while(lee(mid)==0){
        mid--;
    }
    while(lee(mid)){
        mid++;
    }
    g<<mid;
}