Pagini recente » Cod sursa (job #2638897) | Cod sursa (job #2204406) | Cod sursa (job #490168) | Cod sursa (job #3032087) | Cod sursa (job #1606474)
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int nd=4;
const int dx[4]={1,-1,0,0}, dy[4]={0,0,1,-1};
const int nmax=1000;
int v[nmax+2][nmax+2];
int qx[nmax*nmax+1], qy[nmax*nmax+1];
int qb=1,qe=0;
int v2[nmax+2][nmax+2];
int n,m;
int x1, y1, x2, y2;
int f(int d) {
qb=1;
qe=0;
qe++;
qx[qe]=x1;
qy[qe]=y1;
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
v2[i][j]=0;
}
}
v2[x1][y1]=1;
while (qb<=qe) {
int x=qx[qb], y=qy[qb];
qb++;
for (int i=0; i<nd; i++) {
int xn=x+dx[i], yn=y+dy[i];
if (v[xn][yn]!=-1 && v2[xn][yn]==0 && v[xn][yn]>=d) {
v2[xn][yn]=1;
qe++;
qx[qe]=xn;
qy[qe]=yn;
}
}
}
return v2[x2][y2];
}
int main () {
string s;
fin>>n>>m;
getline(fin,s);
for (int i=1; i<=n; i++){
getline( fin, s);
for (int j=0; j<n; j++){
if (s[j]=='D') {
v[i][j+1]=0;
qe++;
qx[qe]=i;
qy[qe]=j+1;
} else if (s[j]=='.') {
v[i][j+1]=0;
} else if (s[j]=='*') {
v[i][j+1]=-1;
} else if (s[j]=='I') {
v[i][j+1]=0;
x1=i;
y1=j+1;
} else if (s[j]=='O') {
v[i][j+1]=0;
x2=i;
y2=j+1;
}
}
}
for (int i=0; i<=n+1; i++) {
v[0][i]=-1;
v[n+1][i]=-1;
}
for (int i=0; i<=m+1; i++) {
v[i][0]=-1;
v[i][m+1]=-1;
}
while (qb<=qe) {
int x=qx[qb],y=qy[qb];
qb++;
for (int i=0; i<nd; i++) {
int xn=x+dx[i], yn=y+dy[i];
if (v[xn][yn]==0) {
v[xn][yn]=v[x][y]+1;
qe++;
qx[qe]=xn;
qy[qe]=yn;
}
}
}
int n2;
for (n2=1; n2<=n*n; n2*=2 ) {
}
n2/=2;
int sol=0;
for (int step=n2; step>0; step/=2) {
if (sol+step<=m*n && f(sol+step)==1) {
sol+=step;
}
}
fout<<sol<<"\n";
return 0;
}