Cod sursa(job #1867791)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 4 februarie 2017 12:43:19
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#include <bitset>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
int n, m, i, j, iv,ok, jv , ix, jx, iy, jy,u,p, v[1011][1011],d, maxi,dr,st, mid;
pair<int ,int > s[1011];
bitset<1011> a[1011];

char aux;
int id[4]={0, 0 ,-1 ,1};
int jd[4]={-1, 1, 0, 0};

void fil(int i, int j, int val)
{
    int iv, jv,d ;
    a[i][j]=0;
    if(i==iy&&j==jy)
        ok=1;
    for(d=0;d<=3;d++)
        {
            iv=i+id[d];
            jv=j+jd[d];
            if(v[iv][jv]>=val&&a[iv][jv]==1&&iv>=1&&iv<=n&&jv>=1&&jv<=m)
                fil(iv, jv, val);
        }
}

int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            fin>>aux;
            if(aux=='.')
                v[i][j]=-1;
            else
                if(aux=='*')
                    v[i][j]=-2;
                else
                    if(aux=='D')
                    {
                        u++;
                        s[u].first=i;
                        s[u].second=j;
                        v[i][j]=1;
                    }
                    else
                        if(aux=='I')
                        {
                            v[i][j]=-1;
                            ix=i;
                            jx=j;
                        }
                        else
                        {
                            v[i][j]=-1;
                            iy=i;
                            jy=i;
                        }
        }
    p=1;
    while(p<=u)
    {
        i=s[p].first;
        j=s[p].second;
        for(d=0;d<=3;d++)
        {
            iv=i+id[d];
            jv=j+jd[d];
            if(v[iv][jv]==-1)
            {
                v[iv][jv]=1+v[i][j];
                if(v[iv][jv]>maxi)
                    maxi=v[iv][jv];
                u++;
                s[u].first=iv;
                s[u].second=jv;
            }
        }
        p++;
    }
    st=1;
    dr=maxi;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        for(i=1;i<=n;i++)
            a[i]=~std::bitset<1011>();
        ok=0;
        if(v[ix][jx]>=mid)
            fil(ix, jx, mid);
        if(ok==0)
            dr=mid-1;
        else
            st=mid+1;
    }
    fout<<dr-1;
    fin.close();
    fout.close();
    return 0;
}