Pagini recente » Cod sursa (job #2050131) | Cod sursa (job #2023752) | Monitorul de evaluare | Cod sursa (job #2072885) | Cod sursa (job #1446469)
#include<cstdio>
#include<algorithm>
#include<deque>
#define INF 999999999
using namespace std;
const int dx[4]={1, 0, -1, 0};
const int dy[4]={0, 1, 0, -1};
deque<pair<int,int> > cd;
int i, j, n, m, a[1005][1005], l[1005][1005], k, sol, crt, mx, cx1, cx2, cy1, cy2, x, y, st, dr, mij;
char s[1002];
inline int min(int a, int b){if (a<=b) return a; else return b;}
void initz(){
for (i=1;i<=n;i++) {a[i][0]=-1; a[i][m+1]=-1;}
for (i=1;i<=m;i++) {a[0][i]=-1; a[n+1][i]=-1;}
for (i=1;i<=n;i++) {
gets(s);
for (j=1;j<=m;j++) {
l[i][j]=0;
if (s[j-1]=='.') a[i][j]=INF;
if (s[j-1]=='*') a[i][j]=0;
if (s[j-1]=='I') {cx1=i; cy1=j; a[i][j]=INF;}
if (s[j-1]=='O') {cx2=i; cy2=j; a[i][j]=INF;}
if (s[j-1]=='D') {a[i][j]=0; cd.push_back(make_pair(i,j));}
}
scanf("\n");
}
}
void fill(){
while (!cd.empty()) {
x=(cd.front()).first; y=(cd.front()).second; cd.pop_front();
for (k=0;k<=3;k++) if (a[x+dx[k]][y+dy[k]]>a[x][y]+1) {
a[x+dx[k]][y+dy[k]]=a[x][y]+1;
if (a[x+dx[k]][y+dy[k]]>mx) mx=a[x+dx[k]][y+dy[k]];
cd.push_back(make_pair(x+dx[k], y+dy[k]));
}
}
}
bool det(int tsh){
cd.clear(); cd.push_back(make_pair(cx1, cy1));
while (!cd.empty()) {
x=(cd.front()).first; y=(cd.front()).second; cd.pop_front();
for (k=0;k<=3;k++)
if ((a[x+dx[k]][y+dy[k]]>=tsh)&&(l[x+dx[k]][y+dy[k]]<crt)) {
if ((x+dx[k]==cx2)&&(y+dy[k]==cy2)) return true;
l[x+dx[k]][y+dy[k]]=crt;
cd.push_back(make_pair(x+dx[k], y+dy[k]));
}
}
return false;
}
int main(){
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n", &n, &m);
initz();
mx=1; fill(); st=1; dr=a[cx1][cy1]; sol=-1; crt=1;
if (det(dr)==true) {printf("%d\n", dr); return 0;}
for (mij=st+(dr-st)/2;st<dr;mij=st+(dr-st)/2) {
l[cx1][cy2]=crt;
if (det(mij)==true) {sol=mij; st=mij+1;}
else dr=mij-1;
crt++;
}
if (det(st)==true) sol=st;
printf("%d\n", sol); return 0;
}