Cod sursa(job #895960)

Utilizator StexanIarca Stefan Stexan Data 27 februarie 2013 13:14:44
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
using namespace std;
#include<iostream>
#include<fstream>

ifstream f("barbar.in");
ofstream g("barbar.out");

int m[1005][1005];
int xu,y,xnou,ynou,r,k,xfinal,yfinal,t,n;
int l[1000001], c[1000001],l2[1000001], c2[1000001];
int dx[]={-1, 0, 1, 0}, dy[]={0, 1, 0, -1};
bool chemare=true;

int lee(int j){
	k=1; int i;
	if(chemare==false)
		j=-j;
	m[xfinal][yfinal]=1000005;
	for(i=1; i<=k; i++)
	{
		xu=l2[i]; y=c2[i];
	for(t=0; t<4; t++)
	{                xnou = xu+dx[t];
	ynou = y+dy[t];
	if((m[xnou][ynou]>=j)==chemare)
	{
		m[xnou][ynou]=-j; 
		k++;
		l2[k]=xnou;
		c2[k]=ynou;
	}
	}
	}
	if(m[xfinal][yfinal]==1000005||m[xfinal][yfinal]==-1000005)
		return 0;
	else
		return 1;
}

int search(int st, int dr)
{
	int mid=(st+dr)/2; 
	if(lee(mid))
		if(mid==dr)
			return mid;
		else
			return search(mid, dr);
	else
		if(st==mid)
			return mid;
		else
			return search(st, mid);
}

int main()
{
	int i,j;
	char a;
	f>>n>>r;
	for(i=1; i<=n; i++)
		for(j=1; j<=r; j++)
		{
			f>>a;
			if(a=='D')
			{
				m[i][j]=0;
				k++;
				l[k]=i;
				c[k]=j;
			}
			if(a=='*')
			{ ; }
			if(a=='.')
			{ m[i][j]=-1;}
			
			if(a=='I')
			{
				l2[1]=i;
				c2[1]=j;
			}
			if(a=='O')
			{
				xfinal=i;
				yfinal=j;
			}

		}
		
		for(i=1; i<=k; i++)
			{
				xu=l[i]; y=c[i];
				for(t=0; t<4; t++)
				{
					xnou = xu+dx[t];
					ynou = y+dy[t];
					if(m[xnou][ynou]==-1)
					{
						m[xnou][ynou]=m[xu][y]+1;
						k++;
						l[k]=xnou;
						c[k]=ynou;
					}
				}
			}
			m[xfinal][yfinal]=1000001;
		g<<search(1, 1000000);

}