Pagini recente » Cod sursa (job #2183078) | Cod sursa (job #7371) | Cod sursa (job #2335552) | Cod sursa (job #1743366) | Cod sursa (job #2736992)
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int nmax=1002;
char a[nmax][nmax];
int n,m,vc[nmax][nmax];
bool mat[nmax][nmax];
queue<pair<int,int>>q;
struct p{
int x,y;
}v[nmax*nmax],O,I;
int di[]={1,0,-1,0};
int dj[]={0,-1,0,1};
void read() {
in >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
in >> a[i][j];
}
bool valid(int i, int j) {
if (i >= 1 && i <= n && j >= 1 && j <= m)
return 1;
return 0;
}
void dragoni() {
int c1 = 0, c2 = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
if (a[i][j] == 'D') {
q.push(make_pair(i, j));
vc[i][j] = 1;
}
if (a[i][j] == 'O') O = {i,j};
if (a[i][j] == 'I') I = {i,j};
}
}
void lee() {
while (!q.empty()) {
int i = q.front().first;
int j = q.front().second;
for (int k = 0; k < 4; k++) {
int iv = i + di[k];
int jv = j + dj[k];
if (valid(iv, jv) && a[iv][jv] != '*' && !vc[iv][jv]) {
vc[iv][jv] = vc[i][j] + 1;
q.push(make_pair(iv, jv));
}
}
q.pop();
}
}
int maxi(){
int maxi=-999999999,val;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
val=max(maxi,vc[i][j]);
return val;
}
bool parc(int v){
if(vc[I.x][I.y]<=v)
return false;
queue<pair<int,int>>q1;
q1.push(make_pair(I.x,I.y));
mat[I.x][I.y]=1;
while(!q1.empty()){
int i=q1.front().first;
int j=q1.front().second;
if(i==O.x&&j==O.y) return true;
for(int k=0;k<4;k++)
{
int iv=i+di[k];
int jv=j+dj[k];
if(valid(iv,jv)&&a[iv][jv]!='*'&&!mat[iv][jv]&&vc[iv][jv]>v){
mat[iv][jv]=1;
q1.push(make_pair(iv,jv));
}
}
q1.pop();
}
return false;
}
void solve(){
int st=1,dr=maxi(),sol=-1;
while(st<=dr){
int mij=(st+dr)/2;
if(parc(mij)){
sol=mij;
st=mij+1;
}
else dr=mij-1;
}
out<<sol;
}
int main() {
read();
dragoni();
lee();
solve();
return 0;
}