Cod sursa(job #2375791)

Utilizator mirceatlxhaha haha mirceatlx Data 8 martie 2019 12:12:22
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j;
int startx,starty,endx,endy;
int Map[1005][1005];
int verif[1005][1005];
int dp[1005][1005];
int ok=1;
int nr=-4;
int rez=0;
struct axis
{
    int x,y;
};
queue <axis> coada;
axis lg;
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};

bool conditie(int l,int c)
{

    if(Map[l][c]==-1)
        return 0;

    if(l<1 || l>n || c<1 || c>m)
        return 0;
    return 1;
}

bool cond(int l,int c,int val,int nr)
{

     if(l<1 || l>n || c<1 || c>m)
        return 0;
    if(Map[l][c]==-1)
        return 0;
    if(dp[l][c]<val)
        return 0;
    if(Map[l][c]==nr)
        return 0;

    return 1;
}
void Lee()
{
    int cx,cy,nx,ny;
    while(!coada.empty())
    {
        cx=coada.front().x;
        cy=coada.front().y;
        coada.pop();
        for(int k=0;k<4;k++)
        {
           // fout<<2;
            nx=cx+dx[k];
            ny=cy+dy[k];
            if(conditie(nx,ny))
            {
                //fout<<2;
                if(verif[nx][ny])
                    if(dp[cx][cy]+1<dp[nx][ny])
                         dp[nx][ny]=dp[cx][cy]+1;
                    else
                        continue;
                dp[nx][ny]=dp[cx][cy]+1;
                lg.x=nx;
                lg.y=ny;
                coada.push(lg);
                verif[nx][ny]=1;
            }
        }
        //verif[cx][cy]=1;
    }
}
void Citire()
{

    fin>>n>>m;
    fin.get();
    char c;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin>>c;
           // cout<<c;
            if(c=='*')
                Map[i][j]=-1;
            if(c=='D')
            {
                lg.x=i;
                lg.y=j;
                coada.push(lg);
                verif[i][j]=1;
               // fout<<1;
            }

            if(c=='O')
            {
                endx=i;
                endy=j;
            }

            if(c=='I')
            {
                startx=i;
                starty=j;
            }
        }
}

int path_finder(int val,int nr)
{
    int cx,cy,nx,ny;
    lg.x=startx;
    lg.y=starty;
    coada.push(lg);
    while(!coada.empty())
    {
        cx=coada.front().x;
        cy=coada.front().y;
        coada.pop();
        for(int k=0;k<4;k++)
        {
            nx=cx+dx[k];
            ny=cy+dy[k];
            if(nx==endx && ny==endy && dp[nx][ny]>=val)
                return 1;
            if(cond(nx,ny,val,nr))
            {
                lg.x=nx;
                lg.y=ny;
                coada.push(lg);
            }
        }
        Map[cx][cy]=nr;
    }
    return 0;
}
int bs(int left,int right)
{
    int mid;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(path_finder(mid,nr))
        {

            rez=mid;
            left=mid+1;
        }
        else
            right=mid-1;
        nr--;
    }
    return rez;
}
int main()
{
    Citire();
    Lee();
    fout<<bs(1,n+m+5);
    return 0;
}