Cod sursa(job #2140436)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 23 februarie 2018 14:52:54
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n,x,i,j;
const int N=1000;
struct poz
{
    int l,c;
};
const int dc[]= {0,1,0,-1},dl[]= {1,0,-1,0};
int d[N+5][N+5],m[N+5][N+5];
poz q[N*N+5],x0,y0;
int p,u;
int lin,col,finlin,fincol;
bool verif(int k)
{
    p=0;
    u=-1;
    q[++u].l=lin;
    q[u].c=col;
    for(i=1; i<=n; i++)
        for(j=1; j<=x; j++)
            m[i][j]=d[i][j];
            if(m[lin][col]<=k)
                return 0;
            m[lin][col]=0;
    while(p<=u)
    {
        x0=q[p];
        for(i=0; i<4; i++)
        {
            y0.l=x0.l+dl[i];
            y0.c=x0.c+dc[i];
            if(m[y0.l][y0.c]==-1&&d[y0.l][y0.c]>k)
            {
                m[y0.l][y0.c]=m[x0.l][x0.c]+1;
                q[++u]=y0;
            }
        }
        p++;
    }
    if(m[finlin][fincol]!=-1)
        return 1;
    return 0;
}
void cautbin()
{
    int rez=0,pas=1<<10;
    while(pas)
    {
        if(rez+pas<=d[lin][col]&&verif(rez+pas)==1)
            rez+=pas;
        pas/=2;
    }
    out<<rez;
}
int main()
{
    char c1;
    u=-1;
    in>>n>>x>>ws;
    for(i=1; i<=x; i++)
        d[0][i]=d[n+1][i]=1;
    for(i=1;i<=n;i++)
        d[i][0]=d[i][x+1]=1;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=x; j++)
        {
            in>>c1;
            if(c1=='.')
                d[i][j]=-1;
            else if(c1=='D')
            {
                q[++u].l=i;
                q[u].c=j;
            }
            else if(c1=='I')
            {
                lin=i;
                col=j;
                d[i][j]=-1;
            }
            else if(c1=='O')
            {
                finlin=i;
                fincol=j;
                d[i][j]=-1;
            }
            else
                d[i][j]=-2;
        }
        in>>ws;
    }
    while(p<=u)
    {
        x0=q[p];
        for(i=0; i<4; i++)
        {
            y0.l=x0.l+dl[i];
            y0.c=x0.c+dc[i];
            if(d[y0.l][y0.c]==-1)
            {
                d[y0.l][y0.c]=d[x0.l][x0.c]+1;
                q[++u]=y0;
            }
        }
        p++;
    }
    cautbin();
    return 0;
}