Pagini recente » Cod sursa (job #2037402) | Cod sursa (job #1606033) | Cod sursa (job #1839666) | Cod sursa (job #1912547) | Cod sursa (job #2627048)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
char a[1001][1001];
int vis[1001][1001];
int dragon[1001][1001],sx,sy,fx,fy;
const int di[4]={1,0,-1,0};
const int dj[4]={0,1,0,-1};
queue<pair<int,int> > qd;
bool inside(int x,int y)
{
if(x<1 || y<1 || x>n || y>m)return false;
return true;
}
void lee_dragons()
{
while(!qd.empty())
{
int x=qd.front().first;
int y=qd.front().second;
qd.pop();
for(int k=0;k<4;k++)
{
int xnou=x+di[k];
int ynou=y+dj[k];
if(inside(xnou,ynou) && a[xnou][ynou]!='*' && dragon[xnou][ynou]>dragon[x][y]+1)
{
dragon[xnou][ynou]=dragon[x][y]+1;
qd.push(make_pair(xnou,ynou));
}
}
}
}
bool verif(int lim)
{
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)vis[i][j]=0;
queue<pair<int,int> > q;
q.push(make_pair(sx,sy));
vis[sx][sy]=1;
while(!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int k=0;k<4;k++)
{
int xnou=x+di[k];
int ynou=y+dj[k];
if(inside(xnou,ynou) && a[xnou][ynou]!='*' && dragon[xnou][ynou]>=lim && !vis[xnou][ynou])
{
q.push(make_pair(xnou,ynou));
vis[xnou][ynou]=1;
}
}
}
if(vis[fx][fy]==1)
return true;
else
return false;
}
/*
void lee_jucator()
{
while(!qp.empty())
{
int x=qp.front().first;
int y=qp.front().second;
qp.pop();
for(int k=0;k<4;k++)
{
int xnou=x+di[k];
int ynou=y+dj[k];
if(inside(xnou,ynou) && a[xnou][ynou]==0 && dp[xnou][ynou]<min(dp[x][y],dragon[xnou][ynou]))
{
dp[xnou][ynou]=min(dp[x][y],dragon[xnou][ynou]);
///if(xnou==fx && ynou==fy)return;
qp.push(make_pair(xnou,ynou));
}
}
}
}
*/
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dragon[i][j]=INT_MAX;
fin>>a[i][j];
if(a[i][j]=='D')
{
dragon[i][j]=0;
qd.push(make_pair(i,j));
}
else if(a[i][j]=='I')
{
sx=i;sy=j;
}
else if(a[i][j]=='O')
{
fx=i;fy=j;
}
}
}
lee_dragons();
/*
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<dragon[i][j]<<" ";
}
cout<<'\n';
}
*/
long long st=0,dr=n*m,ans=-1;
while(st<=dr)
{
long long mij=(st+dr)/2;
///cout<<mij<<" ";
bool f=verif(mij);
if(f)
ans=mij,st=mij+1;
else
dr=mij-1;
}
fout<<ans;
return 0;
}