Cod sursa(job #895586)

Utilizator StexanIarca Stefan Stexan Data 27 februarie 2013 11:54:31
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 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]=2000; 
			
		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;
				}
			}
		}
		chemare=!chemare;
	if(m[xfinal][yfinal]==2000||m[xfinal][yfinal]==-2000)
		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;
					}
				}
			}
			
		g<<search(1, 100000);

}