Pagini recente » Cod sursa (job #430753) | Cod sursa (job #2651484) | Cod sursa (job #2500905) | Cod sursa (job #1987561) | Cod sursa (job #825916)
Cod sursa(job #825916)
#include <cstdio>
#include <queue>
using namespace std;
char lab[1002][1002];
int cost[1002][1002];
int mincell[1002][1002];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
struct cell
{
int y,x;
};
inline int _min(int a,int b)
{
if(a<b)
return a;
return b;
}
queue<cell> q;
void lee2()
{
cell c;
int i;
while(!q.empty())
{
c = q.front();
q.pop();
for(i=0;i<4;++i)
{
if(lab[c.y+dy[i]][c.x+dx[i]] != '*' && lab[c.y+dy[i]][c.x+dx[i]])
if(!mincell[c.y+dy[i]][c.x+dx[i]])
{
mincell[c.y+dy[i]][c.x+dx[i]] = mincell[c.y][c.x] + 1;
q.push((cell){c.y+dy[i],c.x+dx[i]});
}
}
}
}
void lee()
{
cell c;
int i;
while(!q.empty())
{
c = q.front();
q.pop();
for(i=0;i<4;++i)
if(lab[c.y + dy[i]][c.x+dx[i]] == '.' || lab[c.y + dy[i]][c.x+dx[i]] == 'O')
{
if
(
!cost[c.y+dy[i]][c.x+dx[i]]
||
(
mincell[c.y+dy[i]][c.x+dx[i]] > cost[c.y+dy[i]][c.x+dx[i]]
&&
cost[c.y][c.x] > cost[c.y+dy[i]][c.x+dx[i]]
)
)
{
q.push((cell){c.y+dy[i],c.x+dx[i]});
cost[c.y+dy[i]][c.x+dx[i]] = _min(mincell[c.y+dy[i]][c.x+dx[i]],cost[c.y][c.x]);
}
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int n,m,i,j;
setvbuf(stdin,NULL,_IOFBF,32768);
scanf("%d %d\n",&n,&m);
cell inceput,sfarsit;
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
scanf(" %c ",&lab[i][j]);
if(lab[i][j] == 'I')
inceput= (cell){i,j};
else if(lab[i][j] == 'O')
sfarsit = (cell){i,j};
else if(lab[i][j] == 'D')
q.push((cell){i,j}),mincell[i][j]=1;
}
}
lee2();
q.push(inceput);
cost[inceput.y][inceput.x] = mincell[inceput.y][inceput.x];
lee();
printf("%d\n",cost[sfarsit.y][sfarsit.x]-1);
}