Pagini recente » Monitorul de evaluare | Cod sursa (job #3206979) | Istoria paginii utilizator/thund3r090 | fmi-no-stress-2012/solutii/tamplar | Cod sursa (job #2005260)
#include <bits/stdc++.h>
#define dim 1<<20
//#define dim 99
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i,j,nr,q,w,step,x,y,X,Y,D[1<<10][1<<10],viz[1<<10][1<<10],l9,c9;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
char M[1<<10][1<<10];
queue <pair <int,int> > Q;
int sol=-1,st,dr,mij;
int numar;
bool inside(int x,int y)
{
return (x and y and x<=n and y<=m);
}
bool check(int dist)
{
++nr;
//g<<'\n'<<"*nr="<<nr<<" dist="<<dist<<" sol="<<sol<<" step="<<step<<'\n';
if(D[x][y]>=dist)
Q.push(make_pair(x,y));
while(!Q.empty())
{
//++numar;
q=Q.front().first;
w=Q.front().second;
Q.pop();
//g<<"->Start pt q="<<q<<" si w="<<w<<" "<<Q.size()<<'\n';
if(viz[q][w]==nr) //a mai fost elementul
{
//g<<"**Continua pt q="<<q<<" si w="<<w<<" "<<Q.size()<<'\n';
continue;
}
viz[q][w]=nr;
for(i=0;i<4;++i)
{
l9=q+dx[i];
c9=w+dy[i];
if(inside(l9,c9))
if(M[l9][c9]!='*' and D[l9][c9]>=dist)
{
Q.push(make_pair(l9,c9));
//g<<"%%Valid l9="<<l9<<" si c9="<<c9<<" "<<Q.size()<<'\n';
}
}
}
/******************************/
//g<<"viz pentru nr="<<nr<<'\n';
//for(i=1;i<=n;++i)
//{
// for(j=1;j<=m;++j)
// g<<viz[i][j]<<" ";
// g<<'\n';
//}
////g<<'\n';
/******************************/
//g<<" viz[x][y]="<<viz[x][y]<<" viz[X][Y]="<<viz[X][Y]<<'\n';
return (viz[X][Y]==nr);
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
D[i][j]=dim;
//citire date
for(i=1;i<=n;++i)
{
f>>(M[i]+1);
for(j=1;j<=m;++j)
{
if(M[i][j]=='I') x=i,y=j;
if(M[i][j]=='O') X=i,Y=j;
if(M[i][j]=='D')
{
Q.push(make_pair(i,j));
D[i][j]=0;
}
}
}
/******************************/
//for(i=1;i<=n;++i)
//{
// for(j=1;j<=m;++j)
// g<<D[i][j]<<" ";
// g<<'\n';
//}
/******************************/
++nr;
//Lee
while(!Q.empty())
{
q=Q.front().first;
w=Q.front().second;
Q.pop();
if(viz[q][w]==nr)
continue;
viz[q][w]=nr;
for(i=0;i<4;++i)
{
l9=q+dx[i];
c9=w+dy[i];
if(inside(l9,c9))
if(M[l9][c9]!='*' and D[l9][c9]>D[q][w]+1)
{
D[l9][c9]=D[q][w]+1;
Q.push(make_pair(l9,c9));
}
}
}
/******************************/
//g<<'\n'<<"dupa Lee:"<<'\n';
//for(i=1;i<=n;++i)
//{
// for(j=1;j<=m;++j)
// g<<D[i][j]<<" ";
// g<<'\n';
//}
//g<<'\n';
/******************************/
//g<<'\n'<<"viz pentru nr="<<nr<<'\n';
//for(i=1;i<=n;++i)
//{
// for(j=1;j<=m;++j)
// g<<viz[i][j]<<" ";
// g<<'\n';
//}
//g<<'\n';
/******************************/
// for(step=1<<7;step;step>>=1)
// if(sol+step<=min(n,m))
// if(check(sol+step))
// sol=sol+step;
st=1;
dr=1<<10;
while(st<=dr)
{
mij=(st+dr)/2;
if(mij>min(n,m))
{ dr=mij-1;}
else if(check(mij) )
{
sol=mij;
st=mij+1;
}
else{ dr=mij-1;}
}
g<<sol;
/******************************/
//g<<'\n'<<"viz final:"<<'\n';
//for(i=1;i<=n;++i)
//{
// for(j=1;j<=m;++j)
// g<<viz[i][j]<<" ";
// g<<'\n';
//}
//g<<'\n';
/******************************/
//g<<'\n'<<numar;
return 0;
}