Pagini recente » Statistici Dan Buica (danbuica) | Cod sursa (job #2029352) | Cod sursa (job #1749979) | Cod sursa (job #723414) | Cod sursa (job #1453318)
#include<bits/stdc++.h>
using namespace std;
typedef struct lol {
int x,y;
}troll;
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
int i,j,st=1e9,dr,n,m,pivot,rs,b[1005][1005],viz[1005][1005];
char c;
troll q[1000005],gmb,fnc,aux;
bool Check(int x) {
for(int st=dr=1;st<=dr;++st)
for(int i=0;i<4;++i)
if(viz[q[st].x+dx[i]][q[st].y+dy[i]]==1)
{
aux.x=q[st].x+dx[i]; aux.y=q[st].y+dy[i];
if(b[aux.x][aux.y]<=x) q[++dr].x=aux.x,q[dr].y=aux.y;
if(aux.x==fnc.x && aux.y==fnc.y) return 1;
}
return 0;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
ios_base::sync_with_stdio(0);
cin>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
cin>>c;
if(c=='D') viz[i][j]=-1,q[++dr].x=i,q[dr].y=j;
if(c=='*') viz[i][j]=-1;
if(c=='I') viz[i][j]=-1,gmb.x=i,gmb.y=j;
if(c=='O') fnc.x=i,fnc.y=j;
}
for(i=0;i<=n+1;++i) viz[i][0]=viz[i][m+1]=-1;
for(i=0;i<=m+1;++i) viz[0][i]=viz[n+1][i]=-1;
for(st=1;st<=dr;++st)
for(i=0;i<4;++i)
if(!viz[q[st].x+dx[i]][q[st].y+dy[i]])
{
aux.x=q[st].x+dx[i]; aux.y=q[st].y+dy[i];
viz[aux.x][aux.y]=1;
q[++dr].x=aux.x; q[dr].y=aux.y;
b[aux.x][aux.y]=b[q[st].x][q[st].y]+1;
}
st=0; rs=dr=n*m;
while(st<=dr)
{
pivot=(st+dr)/2; q[1]=gmb;
if(Check(pivot)) rs=min(rs,pivot),dr=pivot-1;
else st=pivot+1;
}
cout<<rs<<'\n';
return 0;
}