Pagini recente » Cod sursa (job #1369919) | Cod sursa (job #2738239) | Cod sursa (job #1386514) | Istoria paginii runda/qwerty-3 | Cod sursa (job #1640951)
#include<cstdio>
#include<queue>
using namespace std;
#define INF 10000000
#define MAX 1000
struct COORD
{
int x, y, dep;
};
inline COORD mk(int x, int y, int dep)
{
COORD ret;
ret.x=x;
ret.y=y;
ret.dep=dep;
return ret;
}
int pozx[MAX+10], pozy[MAX+10];
int maped[MAX+10][MAX+10], parc[MAX+10][MAX+10];
int dx[4]={1, 0, -1, 0};
int dy[4]={0, -1, 0, 1};
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
int n, m, i, j;
int stx, sty, obx, oby;
int cr=0;
char s[MAX+10];
scanf("%d%d", &n, &m);
gets(s);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
maped[i][j]=INF;
parc[i][j]=INF;
}
for(i=1; i<=n; i++)
{
gets(s);
for(j=0; j<m; j++)
{
if(s[j]=='*')
maped[i][j+1]=-1;
if(s[j]=='D')
{
cr++;
pozx[cr]=i;
pozy[cr]=j+1;
}
if(s[j]=='I')
{
stx=i;
sty=j+1;
}
if(s[j]=='O')
{
obx=i;
oby=j+1;
}
}
}
queue<COORD> drag;
for(i=1; i<=cr; i++)
{
drag.push(mk(pozx[i], pozy[i], 1));
maped[pozx[i]][pozy[i]]=1;
}
int x, y, dep, nextx, nexty;
while(!drag.empty())
{
x=drag.front().x;
y=drag.front().y;
dep=drag.front().dep+1;
for(i=0; i<4; i++)
{
nextx=x+dx[i];
nexty=y+dy[i];
if(maped[nextx][nexty]!=-1 && dep<maped[nextx][nexty])
{
maped[nextx][nexty]=dep;
drag.push(mk(nextx, nexty, dep));
}
}
drag.pop();
}
int maxim=-1;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
if(maped[i][j]==INF)
maped[i][j]=0;
else
maped[i][j]--;
if(maped[i][j]>maxim)
maxim=maped[i][j];
}
// for(i=1; i<=n; i++)
// {
// for(j=1; j<=m; j++)
// {
// if(maped[i][j]<0)
// printf("x ");
// else
// printf("%d ", maped[i][j]);
// }
// printf("\n");
// }
// printf("\n");
drag.push(mk(stx, sty, maped[stx][sty]));
parc[stx][sty]=maped[stx][sty];
queue<COORD> drag2;
while(!drag.empty())
{
x=drag.front().x;
y=drag.front().y;
dep=drag.front().dep;
parc[x][y]=dep;
for(i=0; i<4; i++)
{
nextx=x+dx[i];
nexty=y+dy[i];
if(maped[nextx][nexty]>=dep && parc[nextx][nexty]==INF)
{
drag.push(mk(nextx, nexty, dep));
parc[nextx][nexty]=dep;
}
else if(maped[nextx][nexty]==dep-1)
drag2.push(mk(nextx, nexty, dep-1));
}
drag.pop();
if(drag.empty())
while(!drag2.empty())
{
drag.push(drag2.front());
drag2.pop();
}
}
// for(i=1; i<=n; i++)
// {
// for(j=1; j<=m; j++)
// {
// if(parc[i][j]==INF)
// printf("x ");
// else
// printf("%d ", parc[i][j]);
// }
// printf("\n");
// }
if(parc[obx][oby]==INF)
printf("-1");
else
printf("%d", parc[obx][oby]);
return 0;
}