Cod sursa(job #1258192)

Utilizator EpictetStamatin Cristian Epictet Data 8 noiembrie 2014 16:23:40
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <bitset>
#include <queue>
#define Nmax 1010
#define x first
#define y second
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
const int dl[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };
int N, M, sol = -1, V[Nmax][Nmax];
char C[Nmax][Nmax];
pair < int, int > start, stop, aux;
queue < pair < int, int > > Q;
bitset < Nmax > fr[Nmax];

bool Verif(int Min)
{
	queue < pair < int, int > > q;
	Q = q;
	if (V[start.x][start.y] < Min) return false;
	if (V[stop.x][stop.y] < Min) return false;
	for (int i=1; i<=N; i++) fr[i].reset();
	fr[start.x][start.y] = 1;
	Q.push(start);
	while (!Q.empty())
	{
		aux = Q.front();
		Q.pop();
		if (aux.x == stop.x && aux.y == stop.y) return true;
		for (int k=0; k<=3; k++)
		{
			int i = aux.x + dl[k];
			int j = aux.y + dc[k];
			if (!fr[i][j] && C[i][j] == '.' && V[i][j] >= Min)
			{
				Q.push(make_pair(i, j));
				fr[i][j] = 1;
			}
		}
	}
	return false;
}

void Caut_Binar()
{
	int st = 0, dr = N*M, mij;
	while (st <= dr)
	{
		mij = (st + dr) / 2;
		if (Verif(mij))
		{
			sol = mij;
			st = mij + 1;
		}
		else
		{
			dr = mij - 1;
		}
	}
}

void Lee()
{
	while (!Q.empty())
	{
		aux = Q.front();
		fr[aux.x][aux.y] = 1;
		Q.pop();
		for (int k=0; k<=3; k++)
		{
			int i = aux.x + dl[k];
			int j = aux.y + dc[k];
			if (!fr[i][j] && C[i][j] == '.')
			{
				V[i][j] = V[aux.x][aux.y] + 1;
				Q.push(make_pair(i, j));
				fr[i][j] = 1;
			}
		}
	}
}

void Read_Data()
{
	fin >> N >> M;
	for (int i=1; i<=N; i++)
	{
		fin >> (C[i] + 1);
		for (int j=1; j<=M; j++)
		{
			switch (C[i][j])
			{
				case 'I' : 
				{
					start = make_pair(i, j);
					C[i][j] = '.';
					break;
				}
				case 'O' : 
				{
					stop = make_pair(i, j);
					C[i][j] = '.';
					break;
				}
				case 'D' :
				{
					Q.push(make_pair(i, j));
					V[i][j] = 0;
					break;
				}
			}
		}
	}
}

int main()
{
	Read_Data();
	Lee();
	Caut_Binar();
	
	fout << sol << '\n';
	fout.close();
	return 0;
}