Cod sursa(job #757414)

Utilizator Theorytheo .c Theory Data 11 iunie 2012 23:21:40
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 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;
bool viz[MAX][MAX];
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)
			{
				a[in][jn]=true;
				u++;
				c[u][0]=in;
				c[u][1]=jn;
				if(in == xf && jn == yf)
				{
					reset();
					return 1;
				}
			}
		}
		p++;
	}
	reset();
	return 0;
}
int cb()
{
	int p=0,u=n *m,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;


	}
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			if(c[i][j]=='I')
			{
				xi=i;
				yi=j;
				v[i][j] = -1;
			}
			if(c[i][j]=='O')
			{
				xf=i;yf=j;
				v[i][j] = -1;
			}
			if(c[i][j]=='D')//scot nr balaurilor si ii bag in coada
			{
				c1[++nrb][0]=i;
				c1[nrb][1]=j;

			}
			if(c[i][j] == '*')
			{
			    v[i][j] = -2;
			}
			if(c[i][j] == '.')
                v[i][j] = -1;

		}

		//afis();
		lee();


		fout << cb();


}
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(in>0&&jn>0 && in<=n&& jn<=m &&v[in][jn]== -1)
			{
				u++;
				c1[u][0]=in;
				c1[u][1]=jn;

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

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

}