Pagini recente » Cod sursa (job #3161052) | Cod sursa (job #565462) | Cod sursa (job #2905767) | Cod sursa (job #2766378) | Cod sursa (job #938815)
Cod sursa(job #938815)
#include <fstream>
#include <cstring>
#include <queue>
#define In "barbar.in"
#define Out "barbar.out"
#define Nmax 1002
#define Inf 0x3f3f3f3f
#define lin first
#define col second
using namespace std;
char a[Nmax][Nmax];
int dist[Nmax][Nmax],n,m,sol;
bool viz[Nmax][Nmax];
queue< pair<int ,int > >Q;
pair<int ,int >pp,ps;
int dl[]={ 0, 1,-1, 0};
int dc[]={ 1, 0, 0,-1};
inline void Citire()
{
ifstream f(In);
f>>n>>m;
for(int i=1;i<=n;i++)
f>>(a[i]+1);
f.close();
}
inline void Bordare()
{
int i;
for(i=1;i<=n;i++)
a[i][0] = a[i][m+1] = '*';
for(i=1;i<=m;i++)
a[0][i] = a[n+1][i] = '*';
}
inline void Init()
{
int i,j;
memset(dist,Inf,sizeof(dist));
Bordare();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='D')
{
Q.push(make_pair(i,j));
dist[i][j] = 0;
}
else
if(a[i][j]=='I')
{
pp.lin = i;
pp.col = j;
}
else
if(a[i][j]=='O')
{
ps.lin = i;
ps.col = j;
}
}
inline void CalculDist()
{
pair<int ,int >p,v;
int i;
while(!Q.empty())
{
p = Q.front();
Q.pop();
for(i=0;i<4;i++)
{
v.lin = p.lin + dl[i];
v.col = p.col + dc[i];
if(a[v.lin][v.col]!='*' && dist[v.lin][v.col]>dist[p.lin][p.col]+1)
{
dist[v.lin][v.col] = dist[p.lin][p.col]+1;
Q.push(v);
}
}
}
}
//returneaza 1 daca exista un traseu care sa nu treca prin elemente <lim
inline bool Compatibil(int lim)
{
if(dist[pp.lin][pp.col]<lim)
return false;
memset(viz,0,sizeof(viz));
viz[pp.lin][pp.col] = true;
pair< int ,int > p,v;
while(!Q.empty())
Q.pop();
Q.push(pp);
while(!Q.empty())
{
p = Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
v.lin = p.lin + dl[i];
v.col = p.col + dc[i];
if(a[v.lin][v.col]!='*' && viz[v.lin][v.col]==false && dist[v.lin][v.col]>=lim)
{
if(v.lin==ps.lin && v.col==ps.col)
return true;
Q.push(v);
viz[v.lin][v.col] = true;
}
}
}
return false;
}
inline void Rezolvare()
{
Init();
CalculDist();
int st,dr,mijl;
st = 0;
dr = n+m;
while(st<=dr)
{
mijl = (st+dr)>>1;
if(Compatibil(mijl))
{
sol = mijl;
st = mijl+1;
}
else
dr = mijl-1;
}
ofstream g(Out);
g<<sol<<"\n";
g.close();
}
int main()
{
Citire();
Rezolvare();
return 0;
}