Cod sursa(job #2690173)

Utilizator felix24mihaiPrava Felix Mihai felix24mihai Data 23 decembrie 2020 12:38:56
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.64 kb
#include <iostream>
#include <queue>
#include <fstream>
#define NMAX 1005
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, line, column, startLine, startColumn, matrix[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 == '.'){
				matrix[i][j] = 0;
			} else if (c == '*'){
				matrix[i][j] = -8;
			} else if (c == 'D'){
				matrix[i][j] = -7;
				dragons.push(make_pair(i,j));
			} else if (c == 'I'){
				matrix[i][j] = 0;
				startLine = i;
				startColumn = j;
			} else if (c == 'O'){
				matrix[i][j] = 0;
				finishLine = i;
				finishColumn = j;
			}
		}
	}
}
int minPathMatrix[NMAX][NMAX];
void border(){
	for (int j = 0; j <= column + 1; j++){
		matrix[0][j] = -1;
		matrix[line + 1][j] = -1;
		dragonMatrix[0][j] = -1;
		dragonMatrix[line + 1][j] = -1;
		minPathMatrix[0][j] = -1;
		minPathMatrix[line + 1][j] = -1;
	}
	for (int i = 0; i <= line + 1; i++){
		matrix[i][0] = -1;
		matrix[i][column + 1] = -1;
		dragonMatrix[i][0] = -1;
		dragonMatrix[i][column + 1] = -1;
		minPathMatrix[i][0] = -1;
		minPathMatrix[i][column + 1] = -1;
	}
}
void dragonBFS(int line, int column){
	queue <pair<int, int>> q;
	for (int i = 0; i < 4; i++){
		int newLine = line + dlin[i];
		int newColumn = column + dcol[i];
		if (matrix[newLine][newColumn] == 0){
			dragonMatrix[newLine][newColumn] = 1;
			q.push(make_pair(newLine, newColumn));
		}
	}
	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 (matrix[newLine][newColumn] == 0){
				int currentPrison = dragonMatrix[line][column];
				int nextPrison = dragonMatrix[newLine][newColumn];
				if (nextPrison == 0 || nextPrison > currentPrison){
					dragonMatrix[newLine][newColumn] = dragonMatrix[line][column] + 1;
					q.push(make_pair(newLine, newColumn));
				}
			}
		}
	}
}
void manBFS(int lineS, int columnS){
	queue <pair<int, int>> q;
	q.push(make_pair(lineS, columnS));
	minPathMatrix[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 (matrix[newLine][newColumn] == 0){
				if (minPathMatrix[line][column] == 0){
					int currentPathMatrix = minPathMatrix[line][column];
					int nextPrison = dragonMatrix[newLine][newColumn]; 
					minPathMatrix[newLine][newColumn] = min(currentPathMatrix, nextPrison);
					q.push(make_pair(newLine, newColumn));
				} else{
					int currentMinPath = minPathMatrix[line][column];
					int nextPrison = dragonMatrix[newLine][newColumn];
					int nextMinPath = minPathMatrix[newLine][newColumn];
					if (nextMinPath < currentMinPath && nextMinPath < nextPrison){
						minPathMatrix[newLine][newColumn] = min(currentMinPath, nextPrison);
						q.push(make_pair(newLine, newColumn));
					}
				}
			}
		}
	}
}
int main() {
	read();
	border();
	while (!dragons.empty()){
		int dragonLine = dragons.front().first;
		int dragonColumn = dragons.front().second;
		dragons.pop();
		dragonBFS(dragonLine, dragonColumn);
	}
	manBFS(startLine, startColumn);
	if (minPathMatrix[finishLine][finishColumn] == 0)
		g << -1;
	else 
		g << minPathMatrix[finishLine][finishColumn];
	return 0;
}