Pagini recente » Cod sursa (job #2557934) | Cod sursa (job #320300) | Cod sursa (job #1999924) | Cod sursa (job #2712323) | Cod sursa (job #2567109)
#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], ans;
int stopx, stopy;
int di[] = {1,0,-1,0};
int dj[] = {0,1,0,-1};
char c;
queue <pi> Qdrag;
deque <pi> Q;
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';
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
dist_drag[i][j] = 1e9;
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] = 0;
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] == 1e9)
{
dist_drag[iN][jN] = dist_drag[i][j] + 1;
Qdrag.push({iN,jN});
}
}
}
ans = dist_drag[startx][starty];
Q.push_back({startx, starty});
while(!Q.empty())
{
pi act = Q.front();
Q.pop_front();
ans = min(ans, dist_drag[act.first][act.second]);
if(act == make_pair(stopx, stopy))
{
g << ans << '\n';
return 0;
}
for(int k = 0; k < 4; ++k)
{
int iN = act.first + di[k];
int jN = act.second + dj[k];
if(ok(iN,jN) && viz[iN][jN] ==0)
{
viz[iN][jN] = 1;
if(dist_drag[iN][jN] >= ans)
Q.push_front({iN,jN});
else
Q.push_back({iN,jN});
}
}
}
g << -1;
f.close();
g.close();
return 0;
}