Pagini recente » Cod sursa (job #1805030) | Cod sursa (job #48471) | Cod sursa (job #260754) | Cod sursa (job #43355) | Cod sursa (job #1537796)
#include <iostream>
#include <fstream>
#include <queue>
#include <set>
using namespace std;
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
const int dx[] = {0,0,1,-1};
const int dy[] = {1,-1,0,0};
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int n,m,a[1001][1001],isDragon[1001][1001], rs = 2000;
char ch;
pair<int,int> start,finish;
deque< pair<int,int> > q;
set< pair<int, pair<int,int> > > s;
inline bool inside(int x, int y) {
return (x >= 0 && x < n && y >= 0 && y < m);
}
int main() {
fi >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
fi >> ch;
switch (ch) {
case 'I':
start.fs = i;
start.sc = j;
break;
case 'O':
finish.fs = i;
finish.sc = j;
break;
case 'D':
q.pb(mp(i,j));
isDragon[i][j] = 1;
break;
case '*':
a[i][j] = -1;
break;
default:
break;
}
}
}
while (!q.empty()) {
pair<int,int> aux = q.front();
q.pop_front();
for (int i=0; i<4; i++) {
int newx = aux.fs + dx[i];
int newy = aux.sc + dy[i];
if (inside(newx, newy) && !isDragon[newx][newy] && a[newx][newy] == 0) {
a[newx][newy] = a[aux.fs][aux.sc]+1;
q.pb(mp(newx, newy));
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cout << a[i][j] << ' ';
}
cout << endl;
}
s.insert(mp(a[start.fs][start.sc], mp(start.fs, start.sc)));
a[start.fs][start.sc] = -2;
while (!s.empty()) {
pair<int, pair<int,int>> aux = (*s.rbegin());
s.erase(*s.rbegin());
rs = min(rs, aux.fs);
if (aux.sc.fs == finish.fs && aux.sc.sc == finish.sc) {
cout << rs;
return 0;
}
for (int i = 0; i < 4; ++i) {
int nx = aux.sc.fs + dx[i];
int ny = aux.sc.sc + dy[i];
if (inside(nx,ny) && a[nx][ny] > 0) {
s.insert(mp(a[nx][ny],mp(nx,ny)));
a[nx][ny] = -2;
}
}
}
cout << -1;
return 0;
}