Cod sursa(job #565433)

Utilizator Catah15Catalin Haidau Catah15 Data 27 martie 2011 19:20:35
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <vector>

using namespace std;


#define P push
#define F first
#define S second
#define PP pop
#define maxN 1005
#define INF (1 << 30)
#define maxDist (1 << 20)


queue < pair <int, int> > Q;
int a[maxN][maxN], cost[maxN][maxN];
int N, M, X, Y, X2, Y2;
int linie[] = {-1, 0, 1, 0};
int col[] = {0, -1, 0, 1};
bool cont[maxN][maxN];
int rsp;



int verif (int dist)
{
	memset (cont, false, sizeof (cont));
	
	for ( ; ! Q.empty (); )
		Q.PP();
	
	Q.P ( make_pair (X, Y) );
	
	cont[X][Y] = true;
	
	
	for ( ; ! Q.empty (); )
	{
		int x = Q.front().F;
		int y = Q.front().S;
		
		Q.PP();
		
		for (int t = 0; t < 4; ++ t)
		{
			int x1 = x + linie[t];
			int y1 = y + col[t];
			
			if (x1 > N || x1 < 1)
				continue;
			if (y1 > M || y1 < 1)
				continue;
			if (cont[x1][y1])
				continue;
			if (cost[x1][y1] < dist)
				continue;
			
			
			cont[x1][y1] = true;
			
			if (x1 == X2 && y1 == Y2)
				return 1;
			
			Q.P ( make_pair (x1, y1) );
		}
	}
	
	return 0;
	
}


int bin_Search()
{
	int st = 0, dr = maxDist, mid;
	
	while (st <= dr)
	{
		mid = (st + dr) / 2;
		
		if (verif (mid))
		{
			rsp = max (rsp, mid);
			
			st = mid + 1;
		}
		else
			dr = mid - 1;
	}
	
	mid = (st + dr) / 2;
	
	if ( ! verif (mid) )
		return 0;
	
	return 1;
	
}


int main()
{
	ifstream f("barbar.in");
	ofstream g("barbar.out");
	
	f >> N >> M;
	
	for (int i = 1; i <= N; ++ i)
		for (int j = 1; j <= M; ++ j)
		{
			char c;
			
			f >> c;
			
			if (c == '.')
			{
				a[i][j] = 0;
				
				cost[i][j] = INF;
				
				continue;
			}
			
			if (c == '*')
			{
				a[i][j] = 1;
				continue;
			}
			
			if (c == 'D')
			{
				a[i][j] = 2;
				
				Q.P( make_pair (i, j) );
				
				cont[i][j] = true;
				
				continue;
			}
			
			if (c == 'I')
			{
				a[i][j] = 5;
				X = i;
				Y = j;
				continue;
			}
			
			if (c == 'O')
			{
				a[i][j] = 6;
				X2 = i;
				Y2 = j;
			}
		}
	
	for ( ; ! Q.empty() ; )
	{
		int x = Q.front().F;
		int y = Q.front().S;
		
		Q.PP();
		
		for (int t = 0; t < 4; ++ t)
		{
			int x1 = x + linie[t];
			int y1 = y + col[t];
			
			if (x1 > N || x1 < 1)
				continue;
			if (y1 > M || y1 < 1)
				continue;
			if (cont[x1][y1])
				continue;
			
			cost[x1][y1] = cost[x][y] + 1;
			
			cont[x1][y1] = true;
			
			Q.P ( make_pair (x1, y1) );
		}
		
	}

	
	if ( ! bin_Search() ) 
		g << - 1;
	else
		g << rsp;
	
	
	f.close();
	g.close();
	
	return 0;
}