Pagini recente » Cod sursa (job #469052) | Cod sursa (job #3176839) | Cod sursa (job #134674) | Cod sursa (job #1833136) | Cod sursa (job #2766623)
#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;
}