Cod sursa(job #433702)

Utilizator soare_cristian16Cristy93 soare_cristian16 Data 4 aprilie 2010 01:41:28
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int dab[4]={0,1,0,-1};
const int dor[4]={1,0,-1,0};
char v[1001][1001];
int n,m,dist[1001][1001],c[1001][1001],inc=1,a1,b1;
struct bfs
{
	int absc,ordon;
}t[1002001],x,y;
void dragon(int absc, int ordon)
{
	int a=1,b=1,i;
	t[1].absc=absc;
	t[1].ordon=ordon;
	while(a<=b)
	{
		x=t[a++];
		for(i=0;i<4;i++)
		{
			y.absc=x.absc+dab[i];
			y.ordon=x.ordon+dor[i];
			if(v[y.absc][y.ordon]=='.'&&(dist[y.absc][y.ordon]==0||dist[y.absc][y.ordon]>dist[x.absc][x.ordon]+1))
			{
				dist[y.absc][y.ordon]=dist[x.absc][x.ordon]+1;
				t[++b]=y;
			}
		}
	}
}
int lee(int d)
{
	int a=1,b=1,i;
	t[1].absc=a1;
	t[1].ordon=b1;
	while(a<=b)
	{
		x=t[a++];
		for(i=0;i<4;i++)
		{
			y.absc=x.absc+dab[i];
			y.ordon=x.ordon+dor[i];
			if(v[y.absc][y.ordon]=='.'&&dist[y.absc][y.ordon]>=d&&c[y.absc][y.ordon]<inc)
			{
				c[y.absc][y.ordon]=inc;
				t[++b]=y;
			}
			if(v[y.absc][y.ordon]=='O')
				return 1;
		}
	}
	inc++;
	return 0;
}
int caut()
{
	int i,pas=n+1,ok;
	for(i=0;pas;pas>>=1)
		if(lee(i+pas))
			return i+pas;
	return -1;
}
int main()
{
	int i,j;
	f>>n>>m;
	for(i=0;i<n;i++)
	{
		f>>v[i];
		for(j=1;j<=m;j++)
		{
			if(v[i][j]=='I')
			{
				a1=i;
				b1=j;
			}
		}
	}
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			if(v[i][j]=='D')
				dragon(i,j);
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
			cout<<dist[i][j]<<" ";
		cout<<"\n";
	}
	g<<caut();
	return 0;
}