Pagini recente » Cod sursa (job #1375796) | Cod sursa (job #2338956) | Cod sursa (job #1092450) | Cod sursa (job #2755951) | Cod sursa (job #3221447)
#include <fstream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n, m;
int v[1005][1005];
vector<pair<int, int>> dragoni;
int dist[1005][1005];
int viz[1005][1005];
int istart, jstart;
int ifin, jfin;
queue<pair<int, int>> q;
multiset<pair<int, pair<int, int>>> st;
//{dist, {i, j}}
int di[] = {1, -1, 0, 0};
int dj[] = {0, 0, 1, -1};
int main()
{
in>>n>>m;
string s;
for(int i = 1; i<=n; i++)
{
in>>s;
for(int j = 1; j<=m; j++)
{
if(s[j - 1] == '.')
{
v[i][j] = 0;
}
else if(s[j - 1] == '*')
{
v[i][j] = -1;
}
else if(s[j - 1] == 'D')
{
dragoni.push_back({i, j});
v[i][j] = -1;
}
else if(s[j - 1] == 'I')
{
v[i][j] = 0;
istart = i;
jstart = j;
}
else if(s[j - 1] == 'O')
{
v[i][j] = 0;
ifin = i;
jfin = j;
}
}
}
//out<<ifin<<" "<<jfin<<'\n';
for(auto it: dragoni)
{
q.push(it);
dist[it.first][it.second] = 1;
//out<<it.first<<" "<<it.second<<'\n';
}
int i, j, iv, jv, d;
while(!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for(int k = 0; k<4; k++)
{
iv = i + di[k];
jv = j + dj[k];
if(iv >= 1 && iv <= n && jv >= 1 && jv <= m && dist[iv][jv] == 0 && v[iv][jv] == 0)
{
q.push({iv, jv});
dist[iv][jv] = dist[i][j] + 1;
}
}
}
/*for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
out<<dist[i][j]<<" ";
}
out<<'\n';
}*/
st.insert({dist[istart][jstart] * (-1), {istart, jstart}});
viz[istart][jstart] = 1;
while(!st.empty())
{
d = (*st.begin()).first * (-1);
i = (*st.begin()).second.first;
j = (*st.begin()).second.second;
//out<<i<<" "<<j<<" -> "<<d<<'\n';
st.erase(st.begin());
if(i == ifin && j == jfin)
{
//out<<i<<" "<<j<<'\n';
out<<d - 1;
return 0;
}
for(int k = 0; k<4; k++)
{
iv = i + di[k];
jv = j + dj[k];
if(iv >= 1 && iv <= n && jv >= 1 && jv <= m && viz[iv][jv] == 0 && v[iv][jv] == 0)
{
int dmin = min(d, dist[iv][jv]);
st.insert({dmin * (-1), {iv, jv}});
viz[iv][jv] = 1;
}
}
}
out<<-1;
return 0;
}