Pagini recente » Cod sursa (job #2340912) | Statistici ropot cristina (zsedcftgb) | Istoria paginii runda/eusebiu1/clasament | Cod sursa (job #2413786) | Cod sursa (job #1453331)
#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=-1,b[1005][1005],viz[1005][1005];
bool a[1005][1005];
char c;
troll q[1000005],gmb,fnc,aux;
bool Check(int x) {
int st,dr,i;
if(b[gmb.x][gmb.y]<x) return 0;
memset(a,0,sizeof(a));
for(st=dr=1;st<=dr;++st)
{
if(q[st].x==fnc.x && q[st].y==fnc.y) return 1;
for(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(a[aux.x][aux.y]) continue;
if(b[aux.x][aux.y]>=x) q[++dr].x=aux.x,q[dr].y=aux.y;
a[aux.x][aux.y]=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') 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; dr=n+m;
while(st<=dr)
{
pivot=(st+dr)/2; q[1]=gmb;
if(Check(pivot)) rs=max(rs,pivot),st=pivot+1;
else dr=pivot-1;
}
cout<<rs<<'\n';
return 0;
}