Pagini recente » Cod sursa (job #942250) | Cod sursa (job #1051305) | Cod sursa (job #1833595) | Cod sursa (job #2939810) | Cod sursa (job #2566904)
#include <bits/stdc++.h>
#define FILE_NAME "barbar"
#define fast ios_base :: sync_with_stdio(0); cin.tie(0);
#pragma GCC optimize("O3")
#define NMAX 1010
using namespace std;
ifstream f(FILE_NAME ".in");
ofstream g(FILE_NAME ".out");
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pi;
typedef pair<ld,ld> pct;
const ll inf = 1LL << 60;
const ll mod = 1e9 + 7;
const ld eps = 1e-9;
void add(ll &a , ll b)
{
a += b;
a %= mod;
}
void sub(ll &a, ll b)
{
a = (a - b + mod) % mod;
}
int n, m, d[NMAX][NMAX], viz[NMAX][NMAX], startx, starty,dist_drag[NMAX][NMAX];
int stopx, stopy;
int di[] = {1,0,-1,0};
int dj[] = {0,1,0,-1};
char c;
queue <pi> Qdrag;
inline bool ok(int i, int j)
{
if(i < 1 || i > n || j < 1 || j > m)
return 0 ;
return 1;
}
void printmatrix(int a[][NMAX])
{
for(int i = 1; i <= n; ++i, g<< '\n')
for(int j = 1; j <= m; ++j)
g << a[i][j] << ' ';
g << '\n';
}
struct cmp
{
bool operator() (pi a, pi b)
{
if( d[a.first][a.second] >= d[b.first][b.second])
return 1;
else
return 0;
}
};
priority_queue <pi, vector <pi>, cmp > Q;
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
f >> c;
if(c == 'I')
{
startx = i;
starty = j;
}
else if(c == '*')
{
viz[i][j] = -1;
}
else if(c == 'O')
{
stopx = i;
stopy = j;
}
else if(c == 'D')
{
dist_drag[i][j] = 1;
Qdrag.push({i,j});
}
}
while(!Qdrag.empty())
{
int i,j;
i = Qdrag.front().first;
j = Qdrag.front().second;
Qdrag.pop();
for(int k = 0; k < 4; ++k)
{
int iN = i + di[k];
int jN = j + dj[k];
if(ok(iN,jN) && dist_drag[iN][jN] == 0)
{
dist_drag[iN][jN] = dist_drag[i][j] + 1;
Qdrag.push({iN,jN});
}
}
}
Q.push({startx, starty});
viz[startx][starty] = 1;
d[startx][starty] = dist_drag[startx][starty];
while(!Q.empty())
{
int i,j;
i = Q.top().first;
j = Q.top().second;
Q.pop();
for(int k = 0; k < 4; ++k)
{
int iN = i + di[k];
int jN = j + dj[k];
if(ok(iN,jN) && min(d[i][j], dist_drag[iN][jN]) > d[iN][jN] )
{
viz[iN][jN] = 1;
d[iN][jN] = min(d[i][j], dist_drag[iN][jN]);
Q.push({iN,jN});
}
}
}
//printmatrix(dist_drag);
//printmatrix(d);
g << d[stopx][stopy] - 1<< '\n';
f.close();
g.close();
return 0;
}