Pagini recente » Profil mary05 | Cod sursa (job #1998606)
#include<cstdio>
#include<queue>
#include<cstring>
#include<stack>
#include<cstring>
using namespace std;
const int nmax=1005;
const int inf=1e9;
inline int min(int a,int b)
{
if(a>b)
return b;
return a;
}
typedef pair<int,int> ii;
stack<ii> dragoni;
char g[nmax][nmax];
char ch;
int ddrag[nmax][nmax],ax[]={0,1,0,-1},ay[]={-1,0,1,0},r,c;
int tempdist[nmax][nmax];
ii start,finish;
inline bool bfs(int nr)
{
queue<ii> q;
int i,j;
q.push(start);
for(i=1;i<=r;i++)
for(j=1;j<=c;++j)
tempdist[i][j]=-1;
tempdist[start.first][start.second]=0;
int x,y,newx,newy;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
for(i=0;i<4;++i)
{
newx=x+ax[i];
newy=y+ay[i];
ch=g[newx][newy];
if(tempdist[newx][newy]==-1 && (ch=='.' || ch=='O') && ddrag[newx][newy]>=nr)
{
if(ch=='O')
return 1;
q.push(ii(newx,newy));
tempdist[newx][newy]=tempdist[x][y]+1;
}
}
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j;
scanf("%d%d\n",&r,&c);
for(i=1;i<=r;++i)
{
for(j=1;j<=c;++j)
{
scanf("%c",&ch);
g[i][j]=ch;
if(g[i][j]=='D')
dragoni.push(ii(i,j));
else if(g[i][j]=='I')
start=ii(i,j);
else if(g[i][j]=='O')
finish=ii(i,j);
}
getchar();
}
for(i=1;i<=r;++i)
for(j=1;j<=c;++j)
ddrag[i][j]=inf;
queue<ii> q;
while(!dragoni.empty())
{
q.push(dragoni.top());
ddrag[dragoni.top().first][dragoni.top().second]=0;
dragoni.pop();
}
int x,y,newx,newy;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
for(i=0;i<4;++i)
{
newx=x+ax[i];
newy=y+ay[i];
if(ddrag[newx][newy]>ddrag[x][y]+1)
{
ddrag[newx][newy]=ddrag[x][y]+1;
q.push(ii(newx,newy));
}
}
}
int st,dr;
st=0;
dr=2010;
int med,ans=0;
while(st<=dr)
{
med=((dr-st)>>1)+st;
if(bfs(med))
ans=med,st=med+1;
else
dr=med-1;
}
if(ans==0)
printf("-1");
else
printf("%d",ans);
}