Cod sursa(job #1019305)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 30 octombrie 2013 21:54:52
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
using namespace std;

int di[]={1, -1, 0, 0};
int dj[]={0, 0, 1, -1};

int mat[1002][1002], n, m, li, lf, ci, cf, i, j, u, p, ic, jc, iv, jv, d, dr, st, sol, mid;
int c[2][1000002];
char ch;
bool o[1002][1002], gasit;

int main()
{
	ifstream f("barbar.in");
	ofstream g("barbar.out");
	f>>m;f>>n;
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		f>>ch;
		if(ch=='*')
			mat[i][j]=-1;
		else
		if(ch=='D')
		{
			u++;
			c[0][u]=i;
			c[1][u]=j;
			mat[i][j]=1;
		}
		else
		if(ch=='I')
		{
			li=i;ci=j;
		}
		else
		if(ch=='O')
		{
			lf=i;cf=j;
		}
	}
	p=1;
	while(p<=u)
	{
		ic=c[0][p];
		jc=c[1][p];
		for(d=0;d<=3;d++)
		{
			iv=ic+di[d];
			jv=jc+dj[d];
			if(iv<=m && iv>0 && jv<=n && jv>0 && mat[iv][jv]==0)
			{
				u++;
				c[0][u]=iv;
				c[1][u]=jv;
				mat[iv][jv]=mat[ic][jc]+1;
			}
		}
		p++;
	}
	st=1;dr=n*m;
	sol=0;
	while(st<=dr)
	{
		mid=(st+dr)/2;
		p=1;u=1;
		c[0][u]=li;
		c[1][u]=ci;
		for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
		if(mat[i][j]!=-1)
			o[i][j]=0;
        else
            o[i][j]=1;
		o[li][ci]=1;
		gasit=0;
		while(p<=u && !gasit)
		{
			ic=c[0][p];
			jc=c[1][p];
			for(d=0;d<=3;d++)
			{
				iv=ic+di[d];
				jv=jc+dj[d];
				if(iv<=m && iv>0 && jv<=n && jv>0 && mat[iv][jv]>=mid && o[iv][jv]==0)
				{
					u++;
					c[0][u]=iv;
					c[1][u]=jv;
					o[iv][jv]=1;
					if(iv==lf && jv==cf)
					{
						gasit=1;
						break;
					}
				}
			}
			p++;
		}
		if(gasit)
			st=mid+1;
		else
			dr=mid-1;
	}
	if(dr-1>0)
        g<<dr-1<<"\n";
    else
        g<<"-1"<<"\n";
	/*for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
			g<<mat[i][j]<<" ";
		g<<"\n";
	}*/
	f.close();g.close();
	return 0;
}