Pagini recente » Cod sursa (job #1039277) | Cod sursa (job #2514922) | Cod sursa (job #2151288) | Cod sursa (job #2618265) | Cod sursa (job #2359139)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int n,m,ist,jst;
int a[1001][1001],viz[1001][1001],dist[1001][1001],dir[4][2]={1,0,0,1,-1,0,0,-1};
char c;
queue < pair<int,int> > coada;
void lee()
{
while(!coada.empty())
{
int ii=coada.front().first;
int jj=coada.front().second;
coada.pop();
for(int d=0; d<=3; d++)
{
int i_urm=ii+dir[d][0];
int j_urm=jj+dir[d][1];
if(i_urm<=n && i_urm>=1 && j_urm<=m && j_urm>=1)
if(viz[i_urm][j_urm]==0 && a[i_urm][j_urm]!=-1)
{
dist[i_urm][j_urm]=dist[ii][jj]+1;
viz[i_urm][j_urm]=1;
coada.push(make_pair(i_urm,j_urm));
}
}
}
}
bool ok(int val)
{
coada.push(make_pair(ist,jst));
viz[ist][jst]=1;
bool bun=false;
while(!coada.empty())
{
int ii=coada.front().first;
int jj=coada.front().second;
coada.pop();
if(a[ii][jj]==-4)
bun=true;
for(int d=0; d<=3; d++)
{
int i_urm=ii+dir[d][0];
int j_urm=jj+dir[d][1];
if(i_urm<=n && i_urm>=1 && j_urm<=m && j_urm>=1)
if(viz[i_urm][j_urm]==0 && a[i_urm][j_urm]!=-1 && a[i_urm][j_urm]!=-3)
if(dist[i_urm][j_urm]>=val)
{
viz[i_urm][j_urm]=1;
coada.push(make_pair(i_urm,j_urm));
}
}
}
return bun;
}
int cautbin()
{
int st=0;
int dr=n*m+1;
int sol=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
viz[i][j]=0;
if(ok(mij))
{
st=mij+1;
sol=mij;
}
else
dr=mij-1;
}
return sol;
}
int main()
{
fi>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
fi>>c;
if(c=='I')
{
ist=i;
jst=j;
a[i][j]=-2;
}
if(c=='D')
{
a[i][j]=-3;
coada.push(make_pair(i,j));
viz[i][j]=1;
}
if(c=='*')
a[i][j]=-1;
if(c=='O')
a[i][j]=-4;
}
lee();
fo<<cautbin();
// for(int i=1; i<=n; i++,fo<<endl)
// for(int j=1; j<=m; j++)
// fo<<dist[i][j]<<" ";
return 0;
}