Pagini recente » Cod sursa (job #608154) | Cod sursa (job #666652) | Cod sursa (job #2508735) | Cod sursa (job #1670312) | Cod sursa (job #2975081)
#include <fstream>
#include <queue>
using namespace std;
char v[1005][1005];
int f[1005][1005], d[1005][1005];
pair <int, int> p[5], c, st, fi;
queue <pair<int, int > > q;
void bfs()
{
while(!q.empty())
{
for(int i=1;i<=4;i++)
{
c=q.front();
c.first+=p[i].first;
c.second+=p[i].second;
if(d[c.first][c.second]==0 && v[c.first][c.second]!='*' && v[c.first][c.second]!='D')
{
d[c.first][c.second]=d[q.front().first][q.front().second]+1;
q.push(c);
}
}
q.pop();
}
}
int drum(int mid)
{
int ok=0;
q.push(st);
f[st.first][st.second]=1;
while(!q.empty())
{
if(v[q.front().first][q.front().second]=='O')
ok=1;
for(int i=1;i<=4;i++)
{
c=q.front();
c.first+=p[i].first;
c.second+=p[i].second;
if(d[c.first][c.second]>=mid && v[c.first][c.second]!='*' && f[c.first][c.second]==0)
{
f[c.first][c.second]=1;
q.push(c);
}
}
q.pop();
}
return ok;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n, m, s, d, mid, ok, sol=-1;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>v[i][j];
if(v[i][j]=='D')
{
q.push({i, j});
}
if(v[i][j]=='I')
st={i, j};
if(v[i][j]=='O')
fi={i, j};
}
}
p[1].first=1;
p[2].second=1;
p[3].first=-1;
p[4].second=-1;
for(int i=0;i<=n+1;i++)
{
v[i][0]=v[i][m+1]='*';
}
for(int i=0;i<=m+1;i++)
{
v[0][i]=v[n+1][i]='*';
}
bfs();
s=1;
d=n*m;
while(s<=d)
{
mid=(s+d)/2;
ok=drum(mid);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=0;
}
}
if(ok==1)
{
s=mid+1;
sol=mid;
}
else
d=mid-1;
}
cout<<sol;
return 0;
}