Cod sursa(job #757404)

Utilizator Theorytheo .c Theory Data 11 iunie 2012 22:50:57
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#include<fstream>
#include<string.h>
#define MAX 1004
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char c[MAX][MAX];
int v[MAX][MAX],i,j,k,n,c1[5660000][2],xi,yi,xf,yf,nrb,m;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool a[MAX][MAX];
void lee();
void cit();
void afis();
int cb();
int verifica(int);
void reset()
{
	int i,j;
	for(i=0;i<=n + 1;i++)
		for(j=0;j<=m + 1;j++)
			a[i][j]=0;
}
int verifica(int x)
{
	int p=1,u=1,in,jn,i,j,k;
	c[1][0]=xi;
	c[1][1]=yi;
	a[xi][yi]=true;
	if(v[xi][yi] < x)
        return 0;
	while(p<=u )
	{
		i=c[p][0];
		j=c[p][1];
		for(k=0;k<4;k++)
		{
			in=i+dx[k];
			jn=j+dy[k];
			if(v[in][jn]>=x && in>0 && jn>0 && in<=n && jn<=m && a[in][jn]==0 && c[in][jn] != '*')
			{
				a[in][jn]=true;
				u++;
				c[u][0]=in;
				c[u][1]=jn;
				if(c[in][jn]=='O')
				{
					reset();
					return 1;
				}
			}
		}
		p++;
	}
	reset();
	return 0;
}
int cb()
{
	int p=0,u=10000000,step, i = 0;;
    for(step = 1 ; step <= u ;step <<= 1 );
	for(i = 0 ; step ; step >>= 1)
        if(verifica(i + step) )
        i +=step;
    if(!verifica(i))
     return -1;
    return i;

}
void cit()
{
	int i,j;
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
	    fin >> c[i] + 1;

		//fin.get();
		//fin.get(c[i],1009,'\n');
		//fout<<c[i][m]<<'\n';
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			if(c[i][j]=='I')
			{
				xi=i;
				yi=j;
			}
			if(c[i][j]=='O')
			{
				xf=i;yf=j;
			}
			if(c[i][j]=='D')
			{
				c1[++nrb][0]=i;
				c1[nrb][1]=j;
				//fout<<i<<" "<<j<<'\n';
			}
		}

		afis();
		lee();
//    for(i = 1 ;i <= n; i++)
//    {
//         for(j = 1; j <=m; j++)
//            fout << v[i][j] <<" ";
//        fout<<'\n';
//    }

		fout << cb();
		//fout<<cb();
		//else
		//	fout<<-1;

		//fout<<verifica(2);

}
void lee()
{
	int u=1,p=1,i,j,in,jn,k;

	u=nrb;
	while(p<=u)
	{
		i=c1[p][0];
		j=c1[p][1];

		for(k=0;k<4;k++)
		{
			in=i+dx[k];
			jn=j+dy[k];
			if(c[in][jn]!='*'&&in>0&&jn>0 && in<=n&& jn<=m &&v[in][jn]==0)
			{
				u++;
				c1[u][0]=in;
				c1[u][1]=jn;

				v[in][jn]=v[i][j]+1;

			}
		}
		p++;
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
		    if(c[i][j]== 'D')
                v[i][j] = 0;
                //fout<<v[i][j] <<" ";
		}
		//fout<<'\n';
	}

}
void afis()
{
	int i,j;
	for(i=0;i<=n;i++)
	{
		for(j=0;j<=m;j++)
		{
			v[i][j]=0;
			//fout<<v[i][j]<<" ";
		}
		//fout<<'\n';
	}
}
int main()
{
	cit();
	fin.close();
	return 0;

}