Pagini recente » Rating Rafaela Voiculescu (rafaela_v) | Cod sursa (job #974574) | Cod sursa (job #1748698) | Cod sursa (job #2068640) | Cod sursa (job #779689)
Cod sursa(job #779689)
//Vasilut
#include<fstream>
#include<utility>
#include<queue>
#define NN 1001
#define f first
#define s second
#define mp make_pair
using namespace std;
ofstream out("barbar.out");
const int di[]={-1,1,0,0};
const int dj[]={0,0,-1,1};
int n,m;
int a[NN][NN],d[NN][NN];
int ans;
pair<int ,int > x,y;
queue<pair<int , int > > Q;
void LEE1();
int LEE2(int );
void bsearch(int ,int );
int main()
{
ifstream in("barbar.in");
in>>n>>m;
char c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
in>>c;
if ( c == '.' )
a[i][j]=d[i][j]=0;
if ( c == '*' )
a[i][j]=d[i][j]=-1;
if ( c == 'I' )
x.f=i,x.s=j;
if ( c == 'D' )
{
a[i][j]=-3;
d[i][j]=1;
Q.push(mp(i,j));
}
if ( c== 'O' )
y.f=i,y.s=j;
}
LEE1();
ans=0;
bsearch(1,d[x.f][x.s]);
out<<ans-1;
return 0;
}
void LEE1()
{
int ii,jj;
while(!Q.empty())
{
pair<int,int> K;
K=Q.front();
for(int k=0;k<4;++k)
{
ii= K.f + di[k];
jj= K.s + dj[k];
if( ii>0 && ii<=n && jj>0 && jj<=m && ( d[ii][jj] == 0 || d[ii][jj] > d[K.f][K.s] + 1 ) )
{
d[ii][jj]=d[K.f][K.s] +1;
Q.push(mp(ii,jj));
}
}
Q.pop();
}
}
int LEE2 (int val){
if ( d[x.f][x.s] < val)
return 0;
Q.push(x);
while(!Q.empty()){
pair<int,int> K=Q.front();
for(int k=0;k<4;++k )
{
int ii,jj;
ii=K.f+di[k];
jj=K.s+dj[k];
if( ii>0 && jj>0 && ii<=n &&jj<=m && d[ii][jj]>=val && a[ii][jj]!=val && a[ii][jj]>=0)
{
Q.push(make_pair(ii,jj));
a[ii][jj]=val;
if(ii==y.f&&jj==y.s){
for(;Q.size();Q.pop());
return 1;
}
}
}
Q.pop();
}
return 0;
}
void bsearch (int st, int dr)
{
if (st==dr)
{
if (st>ans && LEE2(st))
ans=st;
return;
}
int mid=(st+dr)>>1;
if (LEE2 (mid)==1)
{
if (mid>ans)ans=mid;
bsearch(mid+1, dr);
}
else
bsearch(st, mid);
}