Cod sursa(job #2756397)

Utilizator Tudor_StefanaStefana Tudor Tudor_Stefana Data 31 mai 2021 15:14:18
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <bits/stdc++.h>
#define NMAX 1005
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, line, column, startLine, startColumn, inputMatrix[NMAX][NMAX];
int finishLine, finishColumn, dragonMatrix[NMAX][NMAX];
int dlin[4] = { 0, 1, 0, -1 };
int dcol[4] = { 1, 0, -1, 0 };
queue <pair<int, int>> dragons;
void read(){
	f >> line >> column;
	char c;
	for (int i = 1; i <= line; i++){
		for (int j = 1; j <= column; j++){
			f >> c;
			if (c == '.'){
				inputMatrix[i][j] = 0;
			} else if (c == '*'){
				inputMatrix[i][j] = -1;
			} else if (c == 'D'){
				inputMatrix[i][j] = -1;
				dragons.push(make_pair(i,j));
			} else if (c == 'I'){
				inputMatrix[i][j] = 0;
				startLine = i;
				startColumn = j;
			} else if (c == 'O'){
				inputMatrix[i][j] = 0;
				finishLine = i;
				finishColumn = j;
			}
		}
	}
}
void border(){
	for (int j = 0; j <= column + 1; j++){
		inputMatrix[0][j] = -1;
		inputMatrix[line + 1][j] = -1;
	}
	for (int i = 0; i <= line + 1; i++){
		inputMatrix[i][0] = -1;
		inputMatrix[i][column + 1] = -1;
	}
}
void dragonBFS(){
	while(!dragons.empty()){
		int line = dragons.front().first;
		int column = dragons.front().second;
		dragons.pop();
		for (int i = 0; i < 4; i++){
			int newLine = line + dlin[i];
			int newColumn = column + dcol[i];
			if (!inputMatrix[newLine][newColumn] && !dragonMatrix[newLine][newColumn]){
				dragonMatrix[newLine][newColumn] = dragonMatrix[line][column] + 1;
				dragons.push(make_pair(newLine, newColumn));
			}
		}
	}
}
void manBFS(int lineS, int columnS){
	queue <pair<int, int>> q;
	q.push(make_pair(lineS, columnS));
	inputMatrix[lineS][columnS] = dragonMatrix[lineS][columnS];
	while(!q.empty()){
		int line = q.front().first;
		int column = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++){
			int newLine = line + dlin[i];
			int newColumn = column + dcol[i];
			if (inputMatrix[newLine][newColumn] != -1){
				int currentPathMatrix = inputMatrix[line][column];
				int nextPrison = dragonMatrix[newLine][newColumn];

				int newMinPath = min(currentPathMatrix, nextPrison);
				if (newMinPath > inputMatrix[newLine][newColumn]){
					inputMatrix[newLine][newColumn] = newMinPath;
					q.push(make_pair(newLine, newColumn));
				}
			}
		}
	}
}
int main() {
	read();
	border();
	dragonBFS();
	manBFS(startLine, startColumn);
	if (inputMatrix[finishLine][finishColumn] == 0)
		g << -1;
	else
		g << inputMatrix[finishLine][finishColumn];
	return 0;
}