Pagini recente » Cod sursa (job #2561865) | Cod sursa (job #1431865) | Borderou de evaluare (job #2012018) | Cod sursa (job #2769452) | Cod sursa (job #173910)
Cod sursa(job #173910)
#include <cstdio>
#include <queue>
#define Nmax 1001
using namespace std;
inline int min(int a, int b)
{
return (a<b)? (a) : (b);
}
const int dx[] = { 0,-1, 1, 0},
dy[] = { 1, 0, 0,-1};
int N,M,a[Nmax][Nmax],xs,xf,ys,yf,sol[Nmax][Nmax];
int b[Nmax][Nmax];
queue <pair <int,int> > Q;
void citire()
{
scanf("%d %d",&N,&M);
char ch;
for(int i=1; i<=N; i++)
for(int j=1; j<=M; j++)
{
scanf("\n %c",&ch);
switch (ch)
{
case '*':
a[i][j] = -1;
break;
case 'D':
Q.push(make_pair(i,j));
b[i][j] = 1;
break;
case 'I':
xs = i;
ys = j;
break;
case 'O':
xf = i;
yf = j;
break;
}
}
}
void fill()
{
int xc,yc,xvec,yvec;
for(; !Q.empty(); Q.pop())
{
xc = Q.front().first;
yc = Q.front().second;
for(int k = 0; k<4; k++)
{
xvec = xc + dx[k];
yvec = yc + dy[k];
if(xvec < 1 || xvec > N) continue;
if(yvec < 1 || yvec > M) continue;
if(b[xvec][yvec] || a[xvec][yvec]) continue;
b[xvec][yvec] = b[xc][yc] + 1;
Q.push(make_pair(xvec,yvec));
}
}
for(int i=1; i<=N; i++)
for(int j=1; j<=M; j++)
if(a[i][j] == 0)
a[i][j] = b[i][j] - 1;
/*for(int i=1; i<=N; i++)
{
for(int j=1; j<=M; j++)
printf("%d ",a[i][j]);
printf("\n");
}*/
}
void solve()
{
for(int i=1; i<=N; i++)
for(int j=1; j<=M; j++)
sol[i][j] = -1;
int xc,yc,xvec,yvec;
sol[xs][ys] = a[xs][ys];
for(Q.push(make_pair(xs,ys)); !Q.empty(); Q.pop())
{
xc = Q.front().first;
yc = Q.front().second;
for(int k=0; k<4; k++)
{
xvec = xc + dx[k];
yvec = yc + dy[k];
if(xvec < 1 || xvec > N) continue;
if(yvec < 1 || yvec > M) continue;
if(a[xvec][yvec] == -1) continue;
if(sol[xvec][yvec] == -1)
{
sol[xvec][yvec] = min(a[xvec][yvec], sol[xc][yc]);
Q.push(make_pair(xvec,yvec));
continue;
}
if(sol[xc][yc] > sol[xvec][yvec])
{
sol[xvec][yvec] = min(sol[xc][yc],a[xvec][yvec]);
Q.push(make_pair(xvec,yvec));
}
}
}
/*for(int i=1; i<=N; i++)
{
for(int j=1; j<=M; j++)
printf("%d ",sol[i][j]);
printf("\n");
}*/
printf("%d\n",sol[xf][yf]);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
citire();
fill();
solve();
return 0;
}