Pagini recente » Cod sursa (job #2931691) | Cod sursa (job #1938506) | Cod sursa (job #398144) | Cod sursa (job #806049) | Cod sursa (job #825376)
Cod sursa(job #825376)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
char lab[1002][1002];
int cost[1002][1002];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
struct cell
{
int y,x;
};
vector<cell> drag;
int dragoni;
inline int _min(int a,int b)
{
if(a<b)
return a;
return b;
}
inline int abs(int a)
{
if(a<0)
return -a;
return a;
}
inline int dist_cell(cell a,cell b)
{
return (abs(a.x-b.x) + abs(a.y-b.y));
}
int mincell(cell a)
{
int i;
int ret = 1<<30;
for(i=0;i<dragoni;++i)
ret = _min(ret,dist_cell(a,drag[i]));
return ret;
}
queue<cell> q;
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((cell){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((cell){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,4096);
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')
drag.push_back((cell){i,j});
}
}
dragoni = drag.size();
q.push(inceput);
cost[inceput.y][inceput.x] = mincell(inceput);
lee();
if(cost[sfarsit.y][sfarsit.x])
printf("%d\n",cost[sfarsit.y][sfarsit.x]);
else
printf("%d\n",-1);
}