Cod sursa(job #911227)

Utilizator vld7Campeanu Vlad vld7 Data 11 martie 2013 14:09:45
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

const int MAX_N = 1005;
const int INF = (1 << 30);
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};

int n, m, pozl, pozc, D[MAX_N][MAX_N], rez[MAX_N][MAX_N];
char A[MAX_N][MAX_N];
queue < pair<int, int> > Q;

void read() {
	string s;
	f >> n >> m;
	for (int i = 1; i <= n; i++) {
		f >> s;
		for (int j = 0; j < m; j++) {
			A[i][j + 1] = s[j];
			if (s[j] == 'D') {
				Q.push (make_pair(i, j + 1));
				D[i][j + 1] = 0;
			} else if (s[j] == 'I') {
				pozl = i;
				pozc = j + 1;
			}
		}
	}
}

void init() {
	for (int i = 1; i <= 1000; i++)
		for (int j = 1; j <= 1000; j++)
			D[i][j] = INF;
}

int conditie(int linie, int coloana) {
	if (linie >= 1 && linie <= n && coloana >= 1 && coloana <= m)
		return 1;
	return 0;
}

void lee() {
	while (!Q.empty()) {
		pair <int, int> X = Q.front();	Q.pop();
		for (int k = 0; k < 4; k++) {
			if (D[X.first][X.second] + 1 < D[X.first + dx[k]][X.second + dy[k]] && conditie(X.first + dx[k], X.second + dy[k])) {
				D[X.first + dx[k]][X.second + dy[k]] = D[X.first][X.second] + 1;
				Q.push (make_pair(X.first + dx[k], X.second + dy[k]));
			}
		}
	}
}

void lee_sukar() {
	rez[pozl][pozc] = D[pozl][pozc];
	
	Q.push (make_pair(pozl, pozc));
	while (!Q.empty()) {
		pair <int, int> X = Q.front();	Q.pop();
		for (int k = 0; k < 4; k++) {
			if (rez[X.first + dx[k]][X.second + dy[k]] > rez[X.first][X.second]) {
				rez[X.first + dx[k]][X.second + dy[k]] = rez[X.first][X.second];
				Q.push (make_pair(X.first + dx[k], X.second + dy[k]));
			}
		}
	}
}

void writeD() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++)
			g << D[i][j] << " ";
		g << '\n';
	}
}

void write_rez() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++)
			g << rez[i][j] << " ";
		g << '\n';
	}
}

int main() {
	init();
	read();
	lee();
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			rez[i][j] = D[i][j];
		
	lee_sukar();
	writeD();
	g << "\n\n\n";
	write_rez();
	
	f.close();
	g.close();
	
	return 0;
}