Pagini recente » Cod sursa (job #1418131) | Cod sursa (job #1564594) | Cod sursa (job #908226) | Cod sursa (job #117523) | Cod sursa (job #2695570)
#include <fstream>
#include <queue>
#include <string>
using namespace std;
const int NMAX = 1000;
int n, m, dist;
int matrix[NMAX+5][NMAX+5];
bool viz[NMAX+5][NMAX+5];
int dl[4] = {0, 1, 0, -1};
int dc[4] = {1, 0, -1, 0};
string s;
struct Cell {
int linie, coloana;
};
//-1 dragon, 1-de unde pleaca barbarul,, -2 -perete
queue<Cell> q;
queue<Cell> q2;
int dragoni[NMAX+5][NMAX+5];
bool validCell(Cell a) {
return a.linie >= 1 && a.linie <= n && a.coloana >= 1 && a.coloana <= m;
}
void bfs() {
Cell a{}, b{};
while(!q.empty()) {
a = q.front();
q.pop();
for(int i = 0; i < 4; i++) {
b.linie = a.linie + dl[i];
b.coloana = a.coloana + dc[i];
if(validCell(b) && !dragoni[b.linie][b.coloana]) {
dragoni[b.linie][b.coloana] = dragoni[a.linie][a.coloana] + 1;
q.push(b);
}
}
}
}
void bfs2() {
Cell a{}, b{};
while(!q2.empty()) {
a = q2.front();
q2.pop();
q.push(a);
}
while(!q.empty()) {
a = q.front();
q.pop();
for(int i = 0; i < 4; i++) {
b.linie = a.linie + dl[i];
b.coloana = a.coloana + dc[i];
if(validCell(b) && matrix[b.linie][b.coloana] == 0 && !viz[b.linie][b.coloana]) {
if(dragoni[b.linie][b.coloana] > dist) {
viz[b.linie][b.coloana] = true;
q.push(b);
}
else {
q2.push(a);
}
}
}
}
}
int main() {
ifstream fin("barbar.in");
ofstream fout("barbar.out");
Cell a{}, start{}, final{};
fin >> n >> m;
fin.get();
for(int i = 1; i <= n; i++) {
getline(fin, s);
for (int j = 0; j < (int) s.size(); j++) {
if (s[j] == '*') {
matrix[i][j + 1] = -2;
dragoni[i][j + 1] = -2;
}
else if (s[j] == 'D') {
matrix[i][j + 1] = -1;
dragoni[i][j + 1] = 1;
a.linie = i;
a.coloana = j + 1;
q.push(a);
}
else if (s[j] == 'I') {
start.linie = i;
start.coloana = j + 1;
viz[start.linie][start.coloana] = true;
}
else if (s[j] == 'O') {
final.linie = i;
final.coloana = j + 1;
}
}
}
bfs();
q2.push(start);
dist = dragoni[start.linie][start.coloana] - 1;
while(dist > 0) {
bfs2();
if(viz[final.linie][final.coloana]) {
fout << dist;
return 0;
}
dist--;
}
fout<< "-1";
fin.close();
fout.close();
return 0;
}