Pagini recente » Cod sursa (job #450718) | Cod sursa (job #185042) | Cod sursa (job #2718333) | Cod sursa (job #886168) | Cod sursa (job #2891673)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
queue<pair<int,int>>q;
int d[1005][1005],dist[1005][1005];
char v[1005][1005];
int n,m,starti,startj,finishi,finishj;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
bool inside(int i, int j)
{
if(i>=1 and i<=n and j>=1 and j<=m and v[i][j]!='*' and v[i][j]!='D' and v[i][j]!='I')
return true;
return false;
}
void lee()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(v[i][j]=='.' or v[i][j]=='O')
d[i][j]=(1<<30);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(v[i][j]=='D')
q.push({i,j});
}
}
while(q.size()>0)
{
int curenti=q.front().first;
int curentj=q.front().second;
q.pop();
for(int w=0;w<4;w++)
{
int vecini=curenti+dx[w];
int vecinj=curentj+dy[w];
if(inside(vecini,vecinj)==true and d[vecini][vecinj]>d[curenti][curentj]+1)
{
d[vecini][vecinj]=d[curenti][curentj]+1;
q.push({vecini,vecinj});
}
}
}
}
bool check(int x)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dist[i][j]=(1<<30);
}
}
q.push({starti,startj});
dist[starti][startj]=0;
while(q.size()>0)
{
int curenti=q.front().first;
int curentj=q.front().second;
q.pop();
for(int w=0;w<4;w++)
{
int vecini=curenti+dx[w];
int vecinj=curentj+dy[w];
if(inside(vecini,vecinj)==true and dist[vecini][vecinj]>dist[curenti][curentj]+1 and d[vecini][vecinj]>=x)
{
dist[vecini][vecinj]=d[curenti][curentj]+1;
q.push({vecini,vecinj});
}
}
}
// cout<<finishi<<" "<<finishj<<endl;
if(dist[finishi][finishj]!=(1<<30))
{
return true;
}
return false;
}
int main()
{
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]=='I')
{
starti=i;
startj=j;
}
else if(v[i][j]=='O')
{
finishi=i;
finishj=j;
}
}
}
lee();
int ans=-1;
int st=1;
int dr=d[starti][startj];
while(st<=dr)
{
int mij=(st+dr)>>1;
//cout<<ans<<endl;
if(check(mij)==true)
{
ans=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
if(ans!=-1)
cout<<ans;
else
cout<<-1;
return 0;
}