Pagini recente » Cod sursa (job #729814) | Cod sursa (job #489347) | Cod sursa (job #1192249) | Cod sursa (job #251891) | Cod sursa (job #2793429)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
const int INF = (1<<30);
const int MAXN = 1005;
vector <pair <int, int>> dragons;
int closestDragon[MAXN][MAXN], walk[MAXN][MAXN];
char mat[MAXN][MAXN]; string row;
int n, m, sol;
void debug(int test[MAXN][MAXN]){
for(int i=1; i<=n; i++, cout<<"\n")
for(int j=1; j<=m; j++, cout<<" ")
if(mat[i][j] == '*')
cout<<"*";
else
cout<<test[i][j];
}
struct End{
int ii;
int jj;
}in, out;
struct cell{
int ii;
int jj;
int dd;
}aux, nod;
int di[] = {+1, -1, 0, 0};
int dj[] = { 0, 0, +1, -1};
void set_dist_from_dragons(){
queue <cell> q;
for(int i=0; i<dragons.size(); i++){
aux = {dragons[i].first, dragons[i].second, 0};
q.push(aux);
closestDragon[aux.ii][aux.jj] = 0;
}
while(!q.empty()){
nod = q.front();
q.pop();
if(nod.dd != closestDragon[nod.ii][nod.jj])
continue;
for(int dir=0; dir < 4; dir++){
int newi = nod.ii + di[dir];
int newj = nod.jj + dj[dir];
if(1 <= newi && newi <= n && 1 <= newj && newj <= m)
if(mat[newi][newj] != '*')
if(closestDragon[newi][newj] == INF){
closestDragon[newi][newj] = nod.dd + 1;
q.push({newi, newj, nod.dd+1});
}
}
}
}
void _fill(int i, int j){
walk[i][j] = 1;
for(int dir=0; dir < 4; dir++){
int newi = i + di[dir];
int newj = j + dj[dir];
if(1 <= newi && newi <= n && 1 <= newj && newj <= m)
if(walk[newi][newj] == 0)
_fill(newi, newj);
}
}
int main (){
fin>>n>>m;
for(int i=1; i<=n; i++){
fin>>row;
for(int j=0; j<m; j++){
mat[i][j+1] = row[j];
closestDragon[i][j+1] = INF;
}
}
int color;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
if(mat[i][j] == 'D')
dragons.push_back({i, j});
if(mat[i][j] == 'I'){
in.ii=i;
in.jj=j;
}
if(mat[i][j] == 'O'){
out.ii=i;
out.jj=j;
}
}
set_dist_from_dragons(); //debug(closestDragon);
int md, st=-1, dr=closestDragon[in.ii][in.jj] + 1;
while(st <= dr){
md=(dr-st)/2+st;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(mat[i][j] == '*' || closestDragon[i][j] < md)
walk[i][j] = -1;
else
walk[i][j] = 0;
if(walk[in .ii][in .jj] == 0)
_fill(in.ii, in.jj);
if(walk[out.ii][out.jj] == 1)
st=md+1;
else
dr=md-1;
}
fout<<(st == -1 ? -1 : dr);
return 0;
}