Pagini recente » Cod sursa (job #987982) | Cod sursa (job #1692547) | Cod sursa (job #475860) | Cod sursa (job #729506) | Cod sursa (job #1841002)
#include <cstdio>
#include <queue>
using namespace std;
struct punct
{
int x,y;
};
queue<punct> q;
int n,m,i1,j1,dist[1010][1010],c;
char v[1010][1010],vaz[1010][1010];
punct v1[5];
int bfs(int l)
{
int p=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
vaz[i][j]=0;
queue<punct> q1;
q1.push({i1,j1});
vaz[i1][j1]=1;
if(dist[i1][j1]>=l)
while(!q1.empty())
{
int x=q1.front().x,y=q1.front().y;
q1.pop();
for(int i=0;i<4;i++)
{
int a=x+v1[i].x,b=y+v1[i].y;
if(vaz[a][b]==0 && dist[a][b]>=l && (v[a][b]=='.' or v[a][b]=='O'))
{
vaz[a][b]=1;
if(v[a][b]=='O') {p=1;break;}
q1.push({a,b});
}
}
if(p==1) break;
}
if(p==1) c=1;
return p;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
v1[0].x=-1;v1[1].y=1;v1[2].x=1;v1[3].y=-1;
for(int i=1;i<=n;i++)
gets(v[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(v[i][j]=='I') {i1=i;j1=j;}
else if(v[i][j]=='D') q.push({i,j});
for(int i=0;i<=n+1;i++)
dist[i][0]=dist[i][m+1]=-1;
for(int i=0;i<=m+1;i++)
dist[0][i]=dist[n+1][i]=-1;
while(!q.empty())
{
int x=q.front().x,y=q.front().y;
q.pop();
for(int i=0;i<4;i++)
{
int a=x+v1[i].x,b=y+v1[i].y;
if((v[a][b]=='.' or v[a][b]=='I' or v[a][b]=='O') && dist[a][b]==0)
{
dist[a][b]=dist[x][y]+1;
q.push({a,b});
}
}
}
for(int i=0;i<=n+1;i++)
vaz[i][0]=vaz[i][m+1]=-1;
for(int i=0;i<=m+1;i++)
vaz[0][i]=vaz[n+1][i]=-1;
int st=1,dr=1000;
while(st<=dr)
{
int mid=(st+dr)/2;
if(bfs(mid)==1) st=mid+1;
else dr=mid-1;
}
if(c==0) printf("-1");
else
printf("%d",dr);
return 0;
}