Cod sursa(job #3212907)

Utilizator cosmin983Pascale Cosmin cosmin983 Data 12 martie 2024 11:56:06
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <queue>


using namespace std;


ifstream cin("barbar.in");
ofstream cout("barbar.out");


const int NMAX = 1e3;
const int directionI[] = { 0, 0, -1, 1 }, directionJ[] = { -1, 1, 0, 0 };


queue <pair <int, int>> q;
int n, m, iS, jS, iF, jF, answer, dragoni[NMAX][NMAX], distante[NMAX][NMAX];
char a[NMAX][NMAX];


bool isInMatrix(int i, int j) {
	return i >= 0 && j >= 0 && i < n && j < m;
}


void read() {
	cin >> n >> m;
	for (int index1 = 0; index1 < n; ++index1) {
		for (int index2 = 0; index2 < m; ++index2) {
			cin >> a[index1][index2];
			if (a[index1][index2] == '.' || a[index1][index2] == '*') {
				continue;
			}
			if (a[index1][index2] == 'D') {
				q.push({ index1, index2 });
				dragoni[index1][index2] = 1;
				continue;
			}
			if (a[index1][index2] == 'I') {
				iS = index1, jS = index2;
				continue;
			}
			iF = index1, jF = index2;
		}
	}
}


void marcheazaDragonii() {
	while (q.empty() == false) {
		int i = q.front().first, j = q.front().second;
		q.pop();


		for (int index = 0; index < 4; ++index) {
			int newI = i + directionI[index], newJ = j + directionJ[index];
			if (isInMatrix(newI, newJ) && a[newI][newJ] != '*' && dragoni[newI][newJ] == 0) {
				dragoni[newI][newJ] = dragoni[i][j] + 1;
				q.push({ newI, newJ });
			}
		}
	}
}


void solve() {
	marcheazaDragonii();


	priority_queue <pair<int, pair<int, int>>> pq;
	pq.push({ 0, {iS, jS} });
	distante[iS][jS] = dragoni[iS][jS];
	while (pq.empty() == false) {
		int i = pq.top().second.first, j = pq.top().second.second;
		pq.pop();
		if (i == iF && j == jF) {
			answer = pq.top().first;
			break;
		}


		for (int index = 0; index < 4; ++index) {
			int newI = i + directionI[index], newJ = j + directionJ[index];
			if (isInMatrix(newI, newJ) && distante[newI][newJ] == 0 && a[newI][newJ] != '*' && a[newI][newJ] != 'D') {
				distante[newI][newJ] = min(distante[i][j], dragoni[newI][newJ]);
				pq.push({ distante[newI][newJ], {newI, newJ} });
			}
		}
	}
}


void display() {
	cout << answer - 1;
}


int main() {
	read();
	solve();
	display();
	return 0;
}