Pagini recente » Cod sursa (job #1918208) | Cod sursa (job #2892680) | Cod sursa (job #304182) | Cod sursa (job #1320918) | Cod sursa (job #2690174)
#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;
}
for (int i = 0; i <= line + 1; i++){
matrix[i][0] = -1;
matrix[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;
}