Pagini recente » Cod sursa (job #2001668) | Cod sursa (job #1771328) | Cod sursa (job #2590914) | Cod sursa (job #832085) | Cod sursa (job #972840)
Cod sursa(job #972840)
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m,d[1010][1010],di[]={-1,0,1,0},dj[]={0,1,0,-1};
int vis[1010][1010];
char grid[1010][1010];
pair <int, int> start, finish;
queue < pair <int, int> > q;
void bordeaza ()
{
int i,j;
for(i=0;i<=n+1;i++)
grid[i][0]=grid[i][m+1]='*';
for(j=0;j<=m+1;j++)
grid[0][j]=grid[n+1][j]='*';
}
void bfs()
{
int xn,yn,x,y,k;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
for(k=0;k<4;k++)
{
xn=x+di[k];
yn=y+dj[k];
if(grid[xn][yn]!='*' && (d[xn][yn] > d[x][y]+1 || !vis[xn][yn]))
{
d[xn][yn]=d[x][y]+1;
vis[xn][yn]=1;
q.push(make_pair(xn,yn));
}
}
q.pop();
}
}
bool check (int min)
{
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
int k,x,y,xn,yn;
q.push(start);
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
vis[x][y]=1;
for(k=0;k<4;k++)
{
xn=x+di[k];
yn=y+dj[k];
if(grid[xn][yn]!='*' && !vis[xn][yn] && d[xn][yn]>=min)
{
if(make_pair(xn,yn)==finish)
return 1;
q.push(make_pair(xn,yn));
vis[xn][yn]=vis[x][y]+1;
}
}
q.pop();
}
return 0;
}
int bs (int right)
{
int left=1,mid,sol=-1;
while(left<=right)
{
mid=(left+right)>>1;
if(check(mid))
{
sol=mid;
left=mid+1;
}
else
right=mid-1;
}
return sol;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j;
char ch;
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&grid[i][j]);
if(grid[i][j]=='D')
q.push(make_pair(i,j));
if(grid[i][j]=='I')
start=make_pair(i,j);
if(grid[i][j]=='O')
finish=make_pair(i,j);
}
scanf("\n");
}
bordeaza();
bfs();
printf("%d\n",bs(n*m));
return 0;
}