Pagini recente » Cod sursa (job #2005887) | Monitorul de evaluare | Istoria paginii runda/miada_tests | Istoria paginii runda/blat4 | Cod sursa (job #2986543)
#include <fstream>
#include <queue>
#define PII pair<int,int>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
queue<PII>coada;
int n,m,mines[1005][1005],mat[1005][1005],dp[1005][1005];
PII d[4]= {{-1,0}, {0,1}, {1,0}, {0,-1}};
int ver(int l,int c)
{
if(l<1)
return 0;
if(c<1)
return 0;
if(l>n)
return 0;
if(c>m)
return 0;
return 1;
}
void push(int linact,int colact)
{
for(int i=0; i<4; i++)
{
int lf,cf;
lf=linact+d[i].first;
cf=colact+d[i].second;
if(ver(lf,cf)&&!mat[lf][cf]&&mines[lf][cf]==-1)
{
coada.push({lf,cf});
mines[lf][cf]=mines[linact][colact]+1;
}
}
}
void lee()
{
while(coada.size())
{
int linact,colact;
linact=coada.front().first;
colact=coada.front().second;
coada.pop();
push(linact,colact);
}
}
void dfs(int la,int ca,int valact)
{
dp[la][ca]=valact;
for(int i=0; i<4; i++)
{
int ln,cn;
ln=la+d[i].first;
cn=ca+d[i].second;
if(ver(ln,cn)&&!mat[ln][cn]&&dp[ln][cn]<valact)
{
if(mines[ln][cn]>valact)
dfs(ln,cn,valact);
else if(mines[ln][cn]!=dp[ln][cn])
dfs(ln,cn,mines[ln][cn]);
}
}
}
int main()
{
int lp,cp,lt,ct;
char ch;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>ch;
mines[i][j]=-1;
switch(ch)
{
case '*':
{
mat[i][j]=1;
break;
}
case 'I':
{
lp=i,cp=j;
break;
}
case 'O':
{
lt=i,ct=j;
break;
}
case 'D':
{
coada.push({i,j});
mines[i][j]=0;
break;
}
}
dp[i][j]=-1;
}
}
lee();
dfs(lp,cp,mines[lp][cp]);
cout<<dp[lt][ct];
return 0;
}