Pagini recente » Cod sursa (job #1801559) | Cod sursa (job #67353) | Cod sursa (job #968877) | Cod sursa (job #2366726) | Cod sursa (job #2686183)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int n,m;
int a[1005][1005],d[1005][1005],b[1005][1005],f[1005][1005];
struct coord
{
int x;
int y;
};
queue<coord> q;
coord pozfin,pozstart;
bool ok(int x,int y)
{
return 1<=x&&x<=n&&1<=y&&y<=m;
}
void Lee()
{
coord w1,w2;
while(!q.empty())
{
w1=q.front();
q.pop();
int x=w1.x,y=w1.y;
for(int k=0;k<=3;k++)
{
int i=x+dx[k],j=y+dy[k];
if(ok(i,j)&&(d[i][j]==-1||d[i][j]>d[x][y]+1)&&a[i][j]!=1)
{
d[i][j]=d[x][y]+1;
w2.x=i;
w2.y=j;
q.push(w2);
}
}
}
}
void Fill(int dist,int x,int y)
{
f[x][y]=1;
for(int k=0;k<=3;k++)
{
int i=x+dx[k],j=y+dy[k];
if((a[i][j]==0||a[i][j]>=3) && d[i][j]>=dist && f[i][j]==0)
Fill(dist,i,j);
}
}
bool Verif(int x)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
f[i][j]=0;
Fill(x,pozstart.x,pozstart.y);
/*if(x==2)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<f[i][j]<<" ";
}
cout<<"\n";
}
}
cout<<"\n------------------------\n";
if(x==2)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(d[i][j]>=x)
cout<<1<<" ";
else
cout<<"0 ";
}
cout<<"\n";
}
}*/
return f[pozfin.x][pozfin.y];
}
void Citire()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
d[i][j]=b[i][j]=-1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
coord auxx;
auxx.x=i;
auxx.y=j;
char aux;
fin>>aux;
if(aux=='*')
a[i][j]=1;
if(aux=='D')
a[i][j]=2, q.push(auxx), d[i][j]=0;
if(aux=='I')
a[i][j]=3, pozstart.x=i, pozstart.y=j;
if(aux=='O')
a[i][j]=4, pozfin.x=i, pozfin.y=j;
}
}
}
int main()
{
Citire();
Lee();
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
fout<<d[i][j]<<" ";
}
fout<<"\n";
}*/
int st=1,dr=n+m,sol=-1;
while(st<=dr)
{
int mij = (st+dr)/2;
if(Verif(mij))
sol = mij, st = mij+1;
else
dr=mij-1;
}
fout<<sol;
return 0;
}