Cod sursa(job #1953974)

Utilizator dragos231456Neghina Dragos dragos231456 Data 5 aprilie 2017 09:44:21
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <iostream>
#include <fstream>
#define intx dragoni[b].x
#define inty dragoni[b].y
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
bool ok=true;
int a[1003][1003],n,m,lt,rt,md,dir_l[4]={0,1,0,-1},dir_c[4]={1,0,-1,0},d,p[1003][1003];
struct {
    int x,y;
}dragoni[1000003],in,out,v[1000003];
char c;
int h,o,k,b;
bool valid()
{
   if(h>0 && o>0 && h<=n && o<=m) return 1;
   return 0;
}
void init()
{
    k=d;
    b=1;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            if(a[i][j]>0) a[i][j]=0;
        }
    }
    while(b<=k && a[intx][inty]<md-1)
    {
        for(int i=0;i<=3;++i)
        {
            h=intx+dir_l[i]; o=inty+dir_c[i];
            if(valid() && a[h][o]==0)
            {
                a[h][o]=max(a[intx][inty],0)+1;
                ++k;
                dragoni[k].x=h;
                dragoni[k].y=o;
            }
        }
        ++b;
    }
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            f>>c;
            if(c=='D') ++k, dragoni[k].x=i, dragoni[k].y=j, a[i][j]=-2;
            else if(c=='*') a[i][j]=-1;
            else if(c=='I')  in.x=i, in.y=j, v[1].x=i, v[1].y=j;
            else if(c=='O')  out.x=i, out.y=j;
        }
    }
    d=k;
    rt=2000;
    while(rt-lt!=1)
    {
        md=(lt+rt)/2;
        init();
        k=1;
        b=1;
        if(a[v[1].x][v[1].y]!=0 || a[out.x][out.y]!=0) rt=md;
        else {
        while(b<=k && (v[b].x!=out.x || v[b].y!=out.y))
        {
            for(int i=0;i<=3;++i)
            {
                h=v[b].x+dir_l[i]; o=v[b].y+dir_c[i];
                if(valid() && a[h][o]==0)
                {
                    a[h][o]=1;
                    ++k;
                    v[k].x=h;
                    v[k].y=o;
                }
            }
            ++b;
        }
        if(v[b].x==out.x && v[b].y==out.y) lt=md;
        else rt=md; }
    }
        if(lt==0) {
        md=0;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
            {
                p[i][j]=a[i][j];
            }
        }
        for(int i=1;i<=d;++i)
        {
            a[dragoni[i].x][dragoni[i].y]=0;
        }
        init();
        k=1;
        b=1;
        while(b<=k && (v[b].x!=out.x || v[b].y!=out.y))
        {
            for(int i=0;i<=3;++i)
            {
                h=v[b].x+dir_l[i]; o=v[b].y+dir_c[i];
                if(valid() && a[h][o]==0)
                {
                    if(p[h][o]==-2) ok=false;
                    a[h][o]=1;
                    ++k;
                    v[k].x=h;
                    v[k].y=o;
                }
            }
            ++b;
        }
        if(v[b].x==out.x && v[b].y==out.y)
        {
            if(ok==1) lt=1;
            else lt=0;
        }
        else lt=-1; }
    g<<lt;
    return 0;
}