Pagini recente » Cod sursa (job #138448) | Cod sursa (job #282631) | Cod sursa (job #2495651) | Cod sursa (job #2499093) | Cod sursa (job #2430741)
#include <bits/stdc++.h>
#define maximm 1005
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int mp[maximm][maximm],n,m,minim, maxim;
queue <pair <int,int> > coada;
bool ch[maximm][maximm], fin[maximm][maximm];
pair <int,int> start,finish;
int di[]={1,0,-1,0};
int dj[]={0,1,0,-1};
bool ok(int i, int j)
{
return (i>0 && j >0 && i<=n && j<=m && mp[i][j]!=-1);
}
void lee()
{
pair <int,int> q;
while (!coada.empty())
{
q=coada.front();
coada.pop();
int i=q.first;
int j=q.second;
for (int d=0;d<4;d++)
{
int i1=i+di[d];
int j1=j+dj[d];
if (ok(i1,j1) && mp[i1][j1]==0 && ch[i1][j1]==0)
{
mp[i1][j1]=mp[i][j]+1;
maxim=max(maxim,mp[i1][j1]);
minim=min(minim,mp[i1][j1]);
coada.push(make_pair(i1,j1));
}
}
}
}
bool valid (int m)
{
memset(fin,0, sizeof(fin));
int i=start.first;
int j=start.second;
pair <int , int > q;
if (mp[i][j] < m )
return false;
fin[i][j]=1;
coada.push(make_pair(i,j));
while (!coada.empty())
{
q=coada.front();
coada.pop();
i=q.first;
j=q.second;
for (int d=0;d<4;d++)
{
int i1=i+di[d];
int j1=j+dj[d];
if (ok(i1,j1) && fin[i1][j1]==0 && mp[i1][j1]>=m)
{
fin[i1][j1]=1;
coada.push(make_pair(i1,j1));
}
}
}
if (fin[finish.first][finish.second]==1)
return true;
return false;
}
int bin()
{
int ans=-1;
int i=minim;
int j=maxim;
while (i <= j)
{
int m=(i+j)/2;
if (valid(m))
{
ans=m;
i=m+1;
}
else j=m-1;
}
if (ans==-1)
return -1;
return ans;
}
int main()
{
f>>n>>m;
char c;
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
{
f>>c;
if (c=='*') //perete
{
mp[i][j]=-1;
ch[i][j]=1;
}
else if (c=='D')
{
// mp[i][j]=-2;
coada.push(make_pair(i,j));
ch[i][j]=1;
}
else if (c=='I')
start=(make_pair(i,j));
else if (c=='O')
finish=(make_pair(i,j));
}
lee();
g<< bin()<<'\n';
return 0;
}