Cod sursa(job #2007039)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 1 august 2017 18:23:58
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <queue>
#include <bitset>
using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
const int nmax=1e3+5;
bitset <nmax> viz[nmax];
struct usu
{
    int x,y;
};
queue <usu> q;
int mij,n,m,v[nmax][nmax],xs,xf,ys,yf,cx,cy,dx[]={-1,0,1,0},dy[]={0,1,0,-1},dist[nmax][nmax],st,dr,sol;
char s[nmax];
void read()
{
    f>>n>>m;
    f.get();
    for(int i=1;i<=n;++i)
    {
        f.getline(s+1,1003);
        for(int j=1;j<=m;++j)
        {
            if(s[j]=='I') xs=i,ys=j;
            if(s[j]=='O') xf=i,yf=j;
            if(s[j]=='D')
            {
                usu t;
                t.x=i;
                t.y=j;
                viz[i][j]=true;
                q.push(t);
            }
        }
    }
}
bool inside(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m;
}
void dragon()
{
    while(!q.empty())
    {
        usu t=q.front();
        q.pop();
        for(int i=0;i<4;++i)
        {
            cx=dx[i]+t.x;
            cy=dy[i]+t.y;
            if(!inside(cx,cy)||viz[cx][cy]==true) continue;
            dist[cx][cy]=dist[t.x][t.y]+1;
            dr=max(dr,dist[cx][cy]);
            viz[cx][cy]=true;
            usu p;
            p.x=cx;
            p.y=cy;
            q.push(p);
        }
    }
}
void clean()
{
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j) viz[i][j]=false;
    }
}
void trip()
{
    viz[xs][ys]=true;
    usu t;
    t.x=xs;
    t.y=ys;
    q.push(t);
    while(!q.empty())
    {
        t=q.front();
        q.pop();
        for(int i=0;i<4;++i)
        {
            cx=t.x+dx[i];
            cy=t.y+dy[i];
            if(!inside(cx,cy)||viz[cx][cy]==true||dist[cx][cy]<mij) continue;
            viz[cx][cy]=true;
            usu p;
            p.x=cx;
            p.y=cy;
            q.push(p);
        }
    }
}
void solve()
{
    st=1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        clean();
        trip();
        if(viz[xf][yf]==true)
        {
            sol=mij;
            st=mij;
        }
        else dr=mij;
    }
}
int main()
{
    read();
    dragon();
    solve();
    g<<sol;
    return 0;
}