Cod sursa(job #560493)

Utilizator rares192Preda Rares Mihai rares192 Data 18 martie 2011 15:32:39
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<fstream>
#include<string>
#include<queue>
using namespace std;

ofstream fout("barbar.out");

#define mp make_pair
#define f  first
#define s  second

void Read();
void Lee_dragon();
void Cauta(int st, int dr);
bool Lee(int);
void init();

int a[1002][1002];
int b[1002][1002];
char aux[1002];

queue<pair< pair<int, int>, int > > Q;
queue<pair<int, int> >Q1;

int n, m, mij1;
int ip, jp, is, js;

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

int main()
{
	Read();
	Lee_dragon();
	Cauta(1, 1000010);
	return 0;
}

void Read()
{
	ifstream fin("barbar.in");
	fin >> n >> m;
	
	fin.get();
	for(int i = 1; i <= n; ++i)
	{
		fin >> aux;
		for(int j = 0; j < m; ++j)
		{
			if( aux[j] == 'D')
				Q.push(mp(mp(i, j+1), 0) ), a[i][j+1] = -2;
			
		if( aux[j] == '*')
				a[i][j+1] = -1;
			
			if( aux[j] == 'I')
				ip = i, jp = j+1;
			
			if( aux[j] == 'O')
				is = i, js = j+1;
		}
		fin.get();
	}
	
}
	

void Lee_dragon()
{
	
	while( !Q.empty() )
	{
		int i = Q.front().f.f;
		int j = Q.front().f.s;
		int d = Q.front().s;
		Q.pop();
		
		for(int k = 0; k < 4; ++k)
		{
			int l = i + di[k];
			int c = j + dj[k];
			
			if( l >= 1 && l <= n && c >= 1 && c <= m && !a[l][c] )
			{
				a[l][c] = d + 1;
				Q.push(mp(mp(l, c), d+1 ) );
			}
		}
		
	}
}


void Cauta(int st, int dr)
{
	int mij = (st + dr) /2;
	init();
	
	if( st + 1 < dr )
	{
		if( !Lee(mij) )
			Cauta(st, mij);
		else
		{
			mij1 = mij;
			Cauta(mij, dr);
		}
	}
	
	if( st == dr)
	{
		if( Lee(dr) )
			fout << -1;
		else
		fout << mij;
		exit(0);
	}
	
	if( st + 1 == dr)
	{
		if( Lee(dr) && Lee(st))
			fout << -1;
		else
		{
			if(Lee(dr) )
			fout << dr;
		else
			fout << st;
		}
		exit(0);
	}
	if( st > dr)
	{
		fout << -1;
		exit(0);
	}
}

void init()
{
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j)
			if( a[i][j] != -1)
				b[i][j] = 0;
			else
				b[i][j] = a[i][j];
}
			

bool Lee(int x)
{
	Q1.push( mp(ip, jp) );
	
	while( !Q1.empty() )
	{
		int i = Q1.front().f;
		int j = Q1.front().s;
		Q1.pop();
		
		for(int k = 0; k < 4; ++k)
		{
			int l = i + di[k];
			int c = j + dj[k];
			if( l >= 1 && l <= n && c >= 1 && c <= m && a[l][c] >= x && !b[l][c])
			{
				if( l == is && c == js)
				{
						while( !Q1.empty() )
						Q1.pop();
						return 1;
				}
				b[l][c] = 3;
				Q1.push( mp(l, c) );
			}
		}
	}
	return 0;
}