Cod sursa(job #974585)

Utilizator Kira96Denis Mita Kira96 Data 17 iulie 2013 16:47:40
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include<fstream>
#include<cstring>
#include<queue>
#include<vector>
#define N 1010
#define NM 1000020
#define DIM 1002000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
queue<int> qx,qy,Q;
int dr,st,e[N][N],i,t,dest,d,sol,nod,j,n,m,mij,E[NM],dsol,xi,yi,xf,yf,yc,xc,x,y,c[N][N];
vector<int> v[NM];
bool viz[NM];
char ch,s[DIM];
void prec()
{
    while(!qx.empty())
    {
        x=qx.front();y=qy.front();
        qx.pop();qy.pop();
        for(i=1;i<=4;++i)
        {
            xc=x+dx[i];
            yc=y+dy[i];
            if(xc<1||yc<1||xc>n||yc>m||e[xc][yc]||c[xc][yc])
                continue;
            e[xc][yc]=e[x][y]+1;
            qx.push(xc); qy.push(yc);
        }
    }
}
void init()
{
    ++t;
    c[xi][yi]=t;
    qx.push(xi);
    qy.push(yi);
    E[t]=e[xi][yi];
    while(!qx.empty())
    {
        x=qx.front();y=qy.front();
        if(c[x][y]==14)
        {
            x++;
            x--;
        }
        qx.pop();qy.pop();
        for(i=1;i<=4;++i)
        {
            xc=x+dx[i];yc=y+dy[i];
            if(xc<1||yc<1||xc>n||yc>m)
                continue;
            if(!c[xc][yc])
            {
            c[xc][yc]=++t;
            if(xc==xf&&yc==yf)
                dest=t;
            E[t]=e[xc][yc];
            qx.push(xc);
            qy.push(yc);
            }
            v[c[x][y]].push_back(c[xc][yc]);
        }
    }
}
int bfs(int mid)
{
    for(i=1;i<=t;++i)
        viz[i]=0;
    Q.push(1);
    viz[1]=1;
    while(!Q.empty())
    {
        nod=Q.front();
        Q.pop();
        if(nod==dest)
        {
            while(!Q.empty())
                Q.pop();
            return 1;
        }
        for(i=0;i<v[nod].size();++i)
        {
            d=v[nod][i];
            if(!viz[d]&&E[d]>=mid)
            {
                Q.push(d);
                viz[d]=1;
            }
        }
    }
    return 0;
}
int main()
{
    f>>n>>m;
	f>>s[0];
	f.get(s+1,DIM,EOF);
    for(i=1;i<=n;++i)
	{
        for(j=1;j<=m;++j)
        {
            ch=s[t++];
			if(ch=='\n')
				return 0;
            if(ch=='D')
            {
                qx.push(i);
                qy.push(j);
                c[i][j]=1;
            }
            else
            if(ch=='I')
                xi=i,yi=j;
            else
            if(ch=='O')
                xf=i,yf=j;
            else
            if(ch=='*')
                c[i][j]=1;
        }
		t++;
	}
	t=0;
    prec();
    st=1;
    dr=min(e[xi][yi],e[xf][yf]);
    init();
    sol=-1;
    while(st<=dr)
    {
        mij=(st+dr)>>1;
        if(bfs(mij))
        {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    g<<sol;
    return 0;
}