Pagini recente » Cod sursa (job #1026848) | Cod sursa (job #1362386) | Cod sursa (job #2620809) | Cod sursa (job #2361511) | Cod sursa (job #2625020)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
int a[1001][1001],dp[1001][1001];
int dragon[1001][1001],sx,sy,fx,fy;
const int di[4]={1,0,-1,0};
const int dj[4]={0,1,0,-1};
queue<pair<int,int> > qd;
queue<pair<int,int > > qp;
bool inside(int x,int y)
{
if(x<1 || y<1 || x>n || y>m)return false;
return true;
}
void lee_dragons()
{
while(!qd.empty())
{
int x=qd.front().first;
int y=qd.front().second;
qd.pop();
for(int k=0;k<4;++k)
{
int xnou=x+di[k];
int ynou=y+dj[k];
if(inside(xnou,ynou) && a[xnou][ynou]==0 && dragon[xnou][ynou]>dragon[x][y]+1)
{
dragon[xnou][ynou]=dragon[x][y]+1;
qd.push(make_pair(xnou,ynou));
}
}
}
}
void lee_jucator()
{
while(!qp.empty())
{
int x=qp.front().first;
int y=qp.front().second;
qp.pop();
for(int k=0;k<4;k++)
{
int xnou=x+di[k];
int ynou=y+dj[k];
if(inside(xnou,ynou) && a[xnou][ynou]==0 && dp[xnou][ynou]<min(dp[x][y],dragon[xnou][ynou]))
{
dp[xnou][ynou]=min(dp[x][y],dragon[xnou][ynou]);
///if(xnou==fx && ynou==fy)return;
qp.push(make_pair(xnou,ynou));
}
}
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=-1;
dragon[i][j]=INT_MAX;
char c;
fin>>c;
if(c=='*')
{
a[i][j]=1;
}
else if(c=='.')
a[i][j]=0;
else if(c=='D')
{
a[i][j]=0;
dragon[i][j]=0;
qd.push(make_pair(i,j));
}
else if(c=='I')
{
sx=i;sy=j;
a[i][j]=0;
}
else if(c=='O')
{
fx=i;fy=j;
a[i][j]=0;
}
}
}
lee_dragons();
dp[sx][sy]=dragon[sx][sy];
qp.push(make_pair(sx,sy));
lee_jucator();
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<dp[i][j]<<" ";
}
cout<<'\n';
}
*/
fout<<dp[fx][fy];
return 0;
}