Pagini recente » Cod sursa (job #2806862) | Cod sursa (job #2802696) | Cod sursa (job #3215677) | Cod sursa (job #425994) | Cod sursa (job #2667793)
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005],n,m,i_s,j_s,i_f,j_f;
const short int dx[]= {-1,0,1,0};
const short int dy[]= {0,1,0,-1};
queue <pair<int,int> > Q;
bitset <1005>V[1005],Zid[1005];
set <pair <int,int> > S;
bool Verif(int x)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
a[i][j]=0;
for(set<pair<int,int> >::iterator i=S.begin(); i!=S.end(); i++)
Q.push(make_pair(i->first,i->second)),a[i->first][i->second]=1;
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for(int d=0; d<=3; d++)
{
int iv=i+dx[d];
int jv=j+dy[d];
if(iv>=1&&jv>=1&&iv<=n&&jv<=m&&!a[iv][jv])
{
if(a[i][j]<x)
{
Q.push(make_pair(iv,jv));
a[iv][jv]=a[i][j]+1;
}
}
}
}
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(a[i][j])
a[i][j]=-1;
if(a[i_s][j_s]==-1)
return false;
a[i_s][j_s]=1;
Q.push(make_pair(i_s,j_s));
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for(int d=0; d<=3; d++)
{
int iv=i+dx[d];
int jv=j+dy[d];
if(iv>=1&&jv>=1&&iv<=n&&jv<=m&&!a[iv][jv])
{
Q.push(make_pair(iv,jv));
a[iv][jv]=a[i][j]+1;
}
}
}
return (a[i_f][j_f]>0);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
char x;
cin>>x;
if(x=='I')
i_s=i,j_s=j;
else if(x=='O')
i_f=i,j_f=j;
else if(x=='*')
Zid[i][j]=true;
else if(x=='D')
V[i][j]=true,S.insert(make_pair(i,j));
}
int st=1,dr=1e3,ans=-1;
while(st<=dr)
{
int mi=(st+dr)>>1;
if(Verif(mi))
ans=mi,st=mi+1;
else
dr=mi-1;
}
printf("%d",ans);
return 0;
}