Pagini recente » Cod sursa (job #873732) | Cod sursa (job #2036150) | Cod sursa (job #2269699) | Cod sursa (job #2177712) | Cod sursa (job #1947846)
#include<fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,-1,1};
int n,m,i,j,st,dr,a,b,c,d,beta,alfa,sta,dra,ai,bi,mid,maxim,ok;
char q;
int mat[1005][1005],w[1005][1005],dragon[1005][1005];
pair<short,short>v[1000100];
int main(){
in>>n>>m;
for(i=1;i<=n;i++){
for( j = 1; j <= m; j ++ ){
in>>q;
if(q=='.'){
mat[i][j]=0;
}
if(q=='D'){
mat[i][j]=-2;
w[i][j]=1;
}
if(q=='*'){
mat[i][j]=-1;
}
if(q=='I'){
mat[i][j]=1;
ai=i;
bi=j;
}
if(q=='O'){
alfa=i;
beta=j;
}
}
}
dr=0;
for( i = 1; i <= n; i ++ ){
for( j = 1; j <= m; j ++ ){
if( w[ i ][ j ] == 1 ){
dr++;
v[ dr ].first = i;
v[ dr ].second = j;
}
}
}
for( st = 1; st <= dr; st ++ ){
for( i = 1; i <= 4; i ++ ){
a=v[st].first;
b=v[st].second;
c=a+dx[i];
d=b+dy[i];
if( c >= 1 && d >= 1 && c<= n && d<= m && w[ c ][ d ] == 0 ){
dr ++;
v[ dr ].first = c;
v[ dr ].second = d;
w[ c ][ d ] = w[ a ][ b ] + 1;
if( w[ c ][ d ] > maxim ){
maxim = w[ c ][ d ];
}
}
}
}
for( st = 1, dr = maxim; st <= dr;){
mid = ( st + dr )/2;
dragon[ai][bi]=1;
ok=1;
for( i = 1; i <= n; i ++ ){
for( j = 1; j <= m; j ++ ){
if( w[i][j] < mid || mat[i][j]==-1){
dragon[i][j]=-1;
}
else{
dragon[ i ][ j ]=0;
}
}
}
if(dragon[ai][bi]==-1){
ok=0;
}
else{
for( sta = 1, dra = 1; sta <= dra; sta ++ ){
for( i = 1; i <= 4; i ++ ){
a=v[ sta ].first;
b=v[ sta ].second;
c=a+dx[ i ];
d=b+dy[ i ];
if( c <= n && d <= n && c >= 1 && d >= 1 && dragon[ c ][ d ] == 0 ){
dra ++;
v[ dra ].first = c;
v[ dra ].second = d;
dragon[ c ][ d ] = dragon[ a ][ b ] + 1;
}
}
}
}
if( dragon[ alfa ][ beta ] <= 0){
ok=0;
}
if(ok==1){
st=mid+1;
}
else{
dr=mid-1;
}
}
out<<dr;
return 0;
}