Cod sursa(job #2766623)

Utilizator AlexZeuVasile Alexandru AlexZeu Data 2 august 2021 16:13:11
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
	
#include <iostream>
	
#include <queue>
	
#include <fstream>
	
#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;
	
			}
	
		}
	
	}
	
}
	
int minPathMatrix[NMAX][NMAX];
	
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;
	
}