Cod sursa(job #447139)

Utilizator loginLogin Iustin Anca login Data 27 aprilie 2010 19:54:44
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
# include <fstream>
# include <queue>
# include <algorithm>
# include <iostream>
# define max MAX
using namespace std;
struct nod{
	int i, j;
	nod(){}
	nod(int I, int J){
		i=I;j=J;}
};
int n, m, a[1003][1003], d[1003][1003], sol=-1, max;
int ist, jst, ifin, jfin, di[4]={0, 0, 1, -1}, dj[4]={-1, 1, 0, 0};
queue<nod>Q;

int in_m(int i, int j)
{
	if (i && j && i<=n && j<=m)return 1;
	return 0;
}

void lee ()
{
	int i, j, ii, jj;
	nod kk;
	while(Q.size())
	{
		kk=Q.front();
		Q.pop();
		i=kk.i;j=kk.j;
		for(int k=0;k<4;++k)
		{
			ii=i+di[k];
			jj=j+dj[k];
			if (a[ii][jj]==0 && in_m(ii, jj) && d[i][j]+1<d[ii][jj])
			{
				d[ii][jj]=d[i][j]+1;
				if (d[ii][jj]>max)max=d[ii][jj];
				Q.push(nod(ii, jj));
			}
		}
	}
}

int bun (int w)
{
	nod kk;
	int i, j, ii, jj;
	a[ist][jst]=w;
	if (d[ist][jst]<w)return 0;
	Q.push(nod(ist, jst));
	while (Q.size())
	{
		kk=Q.front();
		i=kk.i;j=kk.j;
		Q.pop();
		for(int k=0;k<4;++k)
		{
			ii=i+di[k];
			jj=j+dj[k];
			if (in_m(ii, jj) && d[ii][jj]>=w && a[ii][jj]!=w && a[ii][jj]>=0)
			{
				Q.push(nod(ii, jj));
				if (ii==ifin && jj==jfin)return 1;
				a[ii][jj]=w;
			}
		}
	}
	return 0;
}

void cauta (int st, int dr)
{
	if (st==dr)
	{
		if (st>sol && bun(st))
			sol=st;
		return;
	}
	int m=(st+dr)/2;
	if (bun(m))
	{
		if (m>sol)sol=m;
		cauta(m+1, dr);
	}
	else
		cauta(st, m);
}	

int main ()
{
	ifstream fin ("barbar.in");
	ofstream fout ("barbar.out");
	fin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			d[i][j]=1000000000;
	char cc;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			fin>>cc;
			if (cc=='*')a[i][j]=-1;
			if (cc=='D')
			{
				a[i][j]=-2;
				d[i][j]=0;
				Q.push(nod(i, j));
			}
			else
			{
				if (cc=='I'){ist=i;jst=j;}
				else if (cc=='O'){ifin=i;jfin=j;}
			}
		}
	lee();
	cauta(0, d[ist][jst]);
	fout<<sol;
	return 0;
}