Cod sursa(job #1429528)

Utilizator MciprianMMciprianM MciprianM Data 6 mai 2015 16:27:47
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <queue>
#include <utility>
#include <functional>
#include <cstring>

using namespace std;

static const int MAXN = 1009;
typedef pair<int, int> pii;

char t[MAXN][MAXN];
int D[MAXN][MAXN];
bool u[MAXN][MAXN];
int n, m;
pii s, d;
queue<pii> q;
int dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};

void bfs() {
	while(!q.empty()) {
		pii src = q.front();
		q.pop();
		for(int k = 0; k < 4; k++) {
			int ii = src.first + dx[k];
			int jj = src.second + dy[k];
			if(ii >= 0 && jj >= 0 && ii < n && jj < m && !u[ii][jj] && D[ii][jj] > D[src.first][src.second] + 1 && t[ii][jj] != '*') {
				D[ii][jj] = D[src.first][src.second] + 1;
				u[ii][jj] = true;
				q.push(pii(ii, jj));
			}
		}
	}
}

void bfs(pii src, int vmin) {
	memset(u, 0, sizeof(u));
	if(D[src.first][src.second] >= vmin) {
		q.push(src);
		u[src.first][src.second] = true;
	}
	while(!q.empty()) {
		pii src = q.front();
		q.pop();
		for(int k = 0; k < 4; k++) {
			int ii = src.first + dx[k];
			int jj = src.second + dy[k];
			if(ii >= 0 && jj >= 0 && ii < n && jj < m && !u[ii][jj] && D[ii][jj] >= vmin && (t[ii][jj] == '.' || t[ii][jj] == 'O')) {
				u[ii][jj] = true;
				q.push(pii(ii, jj));
			}
		}
	}
}

int main() {
	memset(D, 0x3F, sizeof(D));
	ifstream f("barbar.in");
	f >> n >> m;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++) {
			f >> t[i][j];
			if(t[i][j] == 'I')	s = pii(i, j);
			if(t[i][j] == 'O')	d = pii(i, j);
			if(t[i][j] == 'D') {
				q.push(pii(i, j));
				D[i][j] = 0;
				u[i][j] = true;
			}
		}
	}
	f.close();
	bfs();
	int ans, pas;
	for(pas = 1; pas <= n * m; pas <<= 1);
	for(ans = -1; pas; pas >>= 1) {
		bfs(s, ans + pas);
		if(u[d.first][d.second])	ans += pas;
	}
	ofstream g("barbar.out");
	g << ans << endl;
	g.close();
	return 0;
}