Pagini recente » Cod sursa (job #2910785) | Cod sursa (job #114304) | Cod sursa (job #852939) | Cod sursa (job #2618273) | Cod sursa (job #2540265)
#include <iostream>
#include <fstream>
#include <queue>
#include <iomanip>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int N=1005;
int n,m,istop,jstop,xd,yd;
int dragon[N][N],dude[N][N];
const int di[6]={-1,0,1,0};
const int dj[6]={0,1,0,-1};
queue < pair < int, int > > que,queDragon;
void switch_mat ( char *p, int i, char s[] )
{
switch(*p)
{
case '*': dude[i][p-s+1]=-1;
break;
case 'I': que.push(make_pair(i,p-s+1));
xd=i;
yd=p-s+1;
break;
case 'D': dragon[i][p-s+1]=1;
queDragon.push(make_pair(i,p-s+1));
break;
case 'O': istop=i;
jstop=p-s+1;
break;
case '.': break;
}
}
void Read ()
{
int i;
char s[N];
f>>n>>m;f.get();
for(i=1;i<=n;i++)
{
f.getline(s,N);
char *p;
for(p=s;*p;p++)
switch_mat(p,i,s);
}
}
void out ()
{
int i,j;
for(i=1;i<=n;i++,cout<<'\n')
for(j=1;j<=m;j++)
cout<<setw(2)<<dude[i][j]<<" ";
cout<<'\n';
for(i=1;i<=n;i++,cout<<'\n')
for(j=1;j<=m;j++)
cout<<setw(2)<<dragon[i][j]<<" ";
cout<<'\n';
}
bool ok ( int x, int y )
{
if(x<1 || y<1 || x>n || y>m)
return false;
return true;
}
void lee_drogo ()
{
int t,i,j,inew,jnew;
while(!queDragon.empty())
{
i=queDragon.front().first;
j=queDragon.front().second;
queDragon.pop();
for(t=0;t<4;t++)
{
inew=i+di[t];
jnew=j+dj[t];
if(ok(inew,jnew))
if(!dragon[inew][jnew] || dragon[i][j]+1<dragon[inew][jnew])
{
dragon[inew][jnew]=dragon[i][j]+1;
queDragon.push(make_pair(inew,jnew));
}
}
}
}
void lee_dude ()
{
int t,i,j,inew,jnew;
dude[xd][yd]=dragon[xd][yd];
while(!que.empty())
{
i=que.front().first;
j=que.front().second;
que.pop();
for(t=0;t<4;t++)
{
inew=i+di[t];
jnew=j+dj[t];
if(ok(inew,jnew))
{
int mini;
mini=min(dude[i][j],dragon[inew][jnew]);
if(!dude[inew][jnew] || ( dude[inew][jnew]>0 && mini>dude[inew][jnew] ))
{
que.push(make_pair(inew,jnew));
dude[inew][jnew]=mini;
}
}
}
}
}
int main()
{
Read();
lee_drogo();
lee_dude();
//out();
g<<dude[istop][jstop]-1<<'\n';
return 0;
}