Cod sursa(job #1027444)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 12 noiembrie 2013 19:50:54
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <vector>
using namespace std;

int N, M;
int map[1009][1009];
vector <pair<int, int> > coad[1009]; // pun in coada casutele la distanta x de cel mai apropiat dragon prin care pot sa trec
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

void fill(int x, int y)
{
	int val = map[x][y] + 1;
	for (int i = 0; i < 4; ++i)
		if (x + dx[i] > 0 && x + dx[i] <= N && y + dy[i] > 0 && y + dy[i] <=M)
			if (map[x + dx[i]][y + dy[i]] > val || map[x + dx[i]][y + dy[i]] == 0)
			map[x + dx[i]][y + dy[i]] = val, fill(x + dx[i], y + dy[i]);
		
}
	
int main()
{
	int xx, xy, yx, yy;
	
	freopen("barbar.in", "r", stdin);
	freopen("barbar.out", "w", stdout);
	scanf("%d %d\n", &N, &M);
	for (int i = 1; i <= N; ++i)
	{
		char S[1009];
		scanf("%s", &S);
		for (int j = 0; j < M; ++j)
			if (S[j] == '*')
				map[i][j + 1] = -1; 
			else
				if (S[j] == 'D')
					map[i][j + 1] = 1; 
				else
					if (S[j] == 'I')
						xx = i, xy = j + 1;
					else
						if (S[j] == 'O')
							yx = i, yy = j + 1;
	}
	
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= M; ++j)
			if (map[i][j] == 1)
				fill(i,j);
	
	/*for (int i = 1; i<= N; ++i)
	{
		for (int j = 1 ; j <= M; ++j)
			printf("%d ", map[i][j]);
		printf("\n");
	}		*/
	
	coad[map[xx][xy]].push_back(make_pair(xx,xy));		
	for (int i = map[xx][xy]; i > 1; --i)
	{
		while (!coad[i].empty())
		{
			int x = coad[i].back().first, y = coad[i].back().second;
			coad[i].pop_back();
			for (int j = 0; j < 4; ++j)
				if (x + dx[j] > 0 && x + dx[j] <= N && y + dy[j] > 0 && y + dy[j] <=M)
				{
					if (map[x + dx[j]][y + dy[j]] >= map[x][y])
						map[x + dx[j]][y + dy[j]] = 0, coad[i].push_back(make_pair(x + dx[j], y + dy[j]));
					else
						if (map[x + dx[j]][y + dy[j]] > 1)
							map[x + dx[j]][y + dy[j]] = 0, coad[map[x + dx[j]][y + dy[j]]].push_back(make_pair(x + dx[j], y + dy[j]));
				}
		}
		if (map[yx][yy] == 0)
		{
			printf("%d\n", i - 2);
			break;
		}			
	}		
return 0;
}