Pagini recente » Cod sursa (job #1189881) | Cod sursa (job #552615) | Cod sursa (job #1278500) | Cod sursa (job #1938677) | Cod sursa (job #1334094)
#include <fstream>
using namespace std;
char map[1001][1001];
short drake_map[1001][1001];
short move_map[1001][1001];
short que[5000000][3];
int main()
{
ifstream in("barbar.in");
ofstream out("barbar.out");
short n, m;
short in_x, in_y, out_x, out_y;
short que_bot=0, que_top=0;
in>>n>>m;
for(short i=1; i<=n; ++i)
in>>(map[i]+1);
for(short i=1; i<=n; ++i)
{
for(short j=1; j<=m; ++j)
{
drake_map[i][j]=-1;
move_map[i][j]=-1;
switch(map[i][j])
{
case 'D':
que[que_top][0]=i;
que[que_top][1]=j;
que[que_top][2]=0;
drake_map[i][j]=0;
++que_top;
break;
case 'I':
in_x=i;
in_y=j;
break;
case 'O':
out_x=i;
out_y=j;
break;
}
}
}
//stabilire distanta fata de dragonu
while(que_bot<=que_top)
{
if(1<que[que_bot][0]&&
(drake_map[que[que_bot][0]-1][que[que_bot][1]]==-1||
drake_map[que[que_bot][0]-1][que[que_bot][1]]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
{
++que_top;
que[que_top][0]=que[que_bot][0]-1;
que[que_top][1]=que[que_bot][1];
que[que_top][2]=que[que_bot][2]+1;
drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
if(que[que_bot][0]<n&&
(drake_map[que[que_bot][0]+1][que[que_bot][1]]==-1||
drake_map[que[que_bot][0]+1][que[que_bot][1]]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
{
++que_top;
que[que_top][0]=que[que_bot][0]+1;
que[que_top][1]=que[que_bot][1];
que[que_top][2]=que[que_bot][2]+1;
drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
if(1<que[que_bot][1]&&
(drake_map[que[que_bot][0]][que[que_bot][1]-1]==-1||
drake_map[que[que_bot][0]][que[que_bot][1]-1]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
{
++que_top;
que[que_top][0]=que[que_bot][0];
que[que_top][1]=que[que_bot][1]-1;
que[que_top][2]=que[que_bot][2]+1;
drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
if(que[que_bot][1]<m&&
(drake_map[que[que_bot][0]][que[que_bot][1]+1]==-1||
drake_map[que[que_bot][0]][que[que_bot][1]+1]>drake_map[que[que_bot][0]][que[que_bot][1]]+1))
{
++que_top;
que[que_top][0]=que[que_bot][0];
que[que_top][1]=que[que_bot][1]+1;
que[que_top][2]=que[que_bot][2]+1;
drake_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
++que_bot;
}
que_bot=0;
que_top=0;
que[0][0]=in_x;
que[0][1]=in_y;
que[0][2]=drake_map[in_x][in_y];
move_map[in_x][in_y]=drake_map[in_x][in_y];
while(que_bot<=que_top)
{
if(1<que[que_bot][0]&&
(move_map[que[que_bot][0]-1][que[que_bot][1]]==-1||
(move_map[que[que_bot][0]-1][que[que_bot][1]]<move_map[que[que_bot][0]][que[que_bot][1]]&&
drake_map[que[que_bot][0]-1][que[que_bot][1]]>move_map[que[que_bot][0]-1][que[que_bot][1]])))
{
++que_top;
que[que_top][0]=que[que_bot][0]-1;
que[que_top][1]=que[que_bot][1];
if(drake_map[que[que_bot][0]-1][que[que_bot][1]]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]-1][que[que_bot][1]];
else que[que_top][2]=que[que_bot][2];
move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
if(que[que_bot][0]<n&&
(move_map[que[que_bot][0]+1][que[que_bot][1]]==-1||
(move_map[que[que_bot][0]+1][que[que_bot][1]]<move_map[que[que_bot][0]][que[que_bot][1]]&&
drake_map[que[que_bot][0]+1][que[que_bot][1]]>move_map[que[que_bot][0]+1][que[que_bot][1]])))
{
++que_top;
que[que_top][0]=que[que_bot][0]+1;
que[que_top][1]=que[que_bot][1];
if(drake_map[que[que_bot][0]+1][que[que_bot][1]]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]+1][que[que_bot][1]];
else que[que_top][2]=que[que_bot][2];
move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
if(1<que[que_bot][1]&&
(move_map[que[que_bot][0]][que[que_bot][1]-1]==-1||
(move_map[que[que_bot][0]][que[que_bot][1]-1]<move_map[que[que_bot][0]][que[que_bot][1]]&&
drake_map[que[que_bot][0]][que[que_bot][1]-1]>move_map[que[que_bot][0]][que[que_bot][1]-1])))
{
++que_top;
que[que_top][0]=que[que_bot][0];
que[que_top][1]=que[que_bot][1]-1;
if(drake_map[que[que_bot][0]][que[que_bot][1]-1]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]][que[que_bot][1]-1];
else que[que_top][2]=que[que_bot][2];
move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
if(que[que_bot][1]<m&&
(move_map[que[que_bot][0]][que[que_bot][1]+1]==-1||
(move_map[que[que_bot][0]][que[que_bot][1]+1]<move_map[que[que_bot][0]][que[que_bot][1]]&&
drake_map[que[que_bot][0]][que[que_bot][1]+1]>move_map[que[que_bot][0]][que[que_bot][1]+1])))
{
++que_top;
que[que_top][0]=que[que_bot][0];
que[que_top][1]=que[que_bot][1]+1;
if(drake_map[que[que_bot][0]][que[que_bot][1]+1]<que[que_bot][2]) que[que_top][2]=drake_map[que[que_bot][0]][que[que_bot][1]+1];
else que[que_top][2]=que[que_bot][2];
move_map[que[que_top][0]][que[que_top][1]]=que[que_top][2];
}
++que_bot;
}
out<<move_map[out_x][out_y]<<'\n';
in.close(); out.close();
return 0;
}