Pagini recente » Cod sursa (job #2052525) | Cod sursa (job #2030239) | Cod sursa (job #1641684) | Rating Vladimir Sontea (JesseMcCree) | Cod sursa (job #2147247)
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
#define N 1003
int a[N][N];
short dx[4]={0,1,0,-1};
short dy[4]={1,0,-1,0};
short n,m;
bool b[N][N];
int q[N*N][2];
short x,y,x2,y2;
void fil(int i, int j,int k){
if(i<1 || i>n || j<1 || j>m || a[i][j]<k || b[i][j] || a[i][j]==-1);
else{
b[i][j]=1;
if(i==x2 && j==y2)
return;
fil(i+1,j,k);
fil(i,j+1,k);
fil(i-1,j,k);
fil(i,j-1,k);
}
}
int main(){
int i,j;
in>>n>>m;
short u=0, p=0;
char ch;
for(i=1; i<=n; ++i){
for(j=1; j<=m; ++j){
in>>ch;
switch(ch){
case 'I': x=i, y=j; break;
case 'O': x2=i, y2=j; break;
case '0': x2=i, y2=j; break;
case '*': a[i][j]=-1, b[i][j]=1; ; break;
case 'D': q[++u][0]=i, q[u][1]=j, a[i][j]=1; break;
}
}
}
for(i=0; i<=m+1; ++i)
a[0][i]=a[n+1][i]=-1;
for(i=0; i<=n+1; ++i)
a[i][0]=a[i][m+1]=-1;
for(i=-1; i<=n+2; ++i)
a[i][m+2]=a[i][-1]=-1;
for(i=-1; i<=m+2; ++i)
a[n+2][i]=a[-1][i]=-1;
short c1,c2,v1,v2;
int maxx=0;
while(p<=u){
c1=q[++p][0];
c2=q[p][1];
for(i=0; i<4; ++i){
v1=c1+dx[i];
v2=c2+dy[i];
if(!a[v1][v2]){
a[v1][v2]=a[c1][c2]+1;
maxx=max(maxx,a[v1][v2]);
q[++u][0]=v1;
q[u][1]=v2;
}
}
}
int k;
for(i=maxx; i>=1; --i){
for(j=1; j<=n; ++j)
for(k=1; k<=m; ++k)
b[j][k]=0;
fil(x,y,i);
if(b[x2][y2]){
out<<i-1;
return 0;
}
}
out<<-1;
return 0;
}