Cod sursa(job #797124)

Utilizator vladstoickvladstoick vladstoick Data 13 octombrie 2012 14:22:02
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include<fstream>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct poz{
    int i , j ;
};
queue <poz> coada;
poz pInceput,pFinal;
char sir[1002][1002];
int diri[]={-1,0,1,0};
int dirj[]={0,1,0,-1};
int lee[1002][1002];
int lee2[1002][1002];
int i , n , m;
poz makePoz(int i , int j)
{
    poz a;
    a.i=i;
    a.j=j;
    return a;
}
void afis()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            out<<lee2[i][j]<<"\t";
        out<<"\n";
    }
    out<<"\n";
}
void lee1()
{
    while(!coada.empty())
    {
        poz cur=coada.front();
        coada.pop();
        for(int i=0;i<4;i++)
            if(lee[cur.i+diri[i]][cur.j+dirj[i]]==0)
            {
                coada.push(makePoz(cur.i+diri[i],cur.j+dirj[i]));
                lee[cur.i+diri[i]][cur.j+dirj[i]]=lee[cur.i][cur.j]+1;
            }
    }
}
void clearLee()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            lee2[i][j]=0;

}
void bordare()
{
    for(int i=0;i<=m+1;i++)
    {
        lee[0][i]=-1;
        lee[n+1][i]=-1;
        lee2[0][i]=-1;
        lee2[n+1][i]=-1;
    }
    for(int i=0;i<=n+1;i++)
    {
        lee[i][0]=-1;
        lee[i][m+1]=-1;
        lee2[i][0]=-1;
        lee2[i][m+1]=-1;
    }
}
bool verif (int pas)
{
    clearLee();
    coada.push(pInceput);
    lee2[pInceput.i][pInceput.j]=1;
    while(!coada.empty())
    {
        poz cur=coada.front();
        coada.pop();

        for(int i=0;i<4;i++)
            if(lee[cur.i+diri[i]][cur.j+dirj[i]]>=pas+1 && lee2[cur.i+diri[i]][cur.j+dirj[i]]==0)
            {
                coada.push(makePoz(cur.i+diri[i],cur.j+dirj[i]));
                lee2[cur.i+diri[i]][cur.j+dirj[i]]=1;
            }
    }
   // afis();
    if(lee2[pFinal.i][pFinal.j]==1)
        return true;
    return false;
}
void solve(){
    int i;
    int pas=1<<12;
    for(i=0;pas;pas>>=1)
	{
		if(verif(i+pas)==true)
			i+=pas;
	}
	out<<i;

}
int main()
{
    in>>n>>m;
    bordare();
    in.getline(sir[i],m+2);
    for(int i=1;i<=n;i++)
    {
        in.getline(sir[i],m+2);
        for(int j=0;j<m;j++)
        {
            if(sir[i][j]=='I')
            {
                pInceput.i=i;
                pInceput.j=j+1;
                continue;
            }
            if(sir[i][j]=='O')
            {
                pFinal.i=i;
                pFinal.j=j+1;
                continue;
            }
            if(sir[i][j]=='*')
            {
                lee[i][j+1]=-1;
                continue;
            }
            if(sir[i][j]=='D')
            {
                coada.push(makePoz(i,j+1));
                lee[i][j+1]=1;
            }
        }
    }
    lee1();
    solve();
    return 0;
}