Pagini recente » Cod sursa (job #1655395) | Cod sursa (job #2042211) | Cod sursa (job #3036433) | Cod sursa (job #2349789) | Cod sursa (job #3269454)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1002][1002];
int vizitare[1002][1002];
int n, m;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
const int INF = 1e9;
void Lee_dragoni(vector<pair<int, int>>dragoni, int n, int m)
{
queue <pair <int, int>> coada;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
vizitare[i][j] = INF;
for(auto in: dragoni)
{
coada.push(in);
vizitare[in.first][in.second] = 0;
}
while(!coada.empty())
{
pair<int, int> curenta = coada.front();
coada.pop();
for(int i=0; i<4; ++i)
{
int x = curenta.first + dx[i];
int y = curenta.second + dy[i];
if(x > n || x <= 0 || y > n || y <= 0 || a[x][y] == 1) continue;
if(vizitare[x][y] <= vizitare[curenta.first][curenta.second] + 1) continue;
vizitare[x][y] = vizitare[curenta.first][curenta.second] + 1;
coada.push({x, y});
}
}
}
int vizi[1002][1002];
void Lee(pair<int, int > in, pair<int, int> out, int n, int m)
{
queue <pair <int, int>> coada;
int st = 0, dr = 1000000, mini = -1;
while(st <= dr)
{
int mij = (st+dr)/2;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
vizi[i][j] = false;
coada.push(in);
vizi[in.first][in.second] = 1;
while(!coada.empty())
{
pair<int, int> curenta = coada.front();
coada.pop();
for(int i=0; i<4; ++i)
{
int x = curenta.first + dx[i];
int y = curenta.second + dy[i];
if(x > n || x <= 0 || y > n || y <= 0 || a[x][y] == 1) continue;
if(vizi[x][y]) continue;
if(vizitare[x][y] < mij) continue;
vizi[x][y] = true;
coada.push({x, y});
}
}
if(!vizi[out.first][out.second] or vizitare[in.first][in.second] < mij)
dr = mij-1;
else{
st = mij + 1;
mini = mij;
}
}
fout << -1;
}
int main()
{
int n, m;
vector<pair<int, int>> dragoni;
pair<int, int> intrare, iesire;
char s[1002];
fin >> n >> m;
for(int i=1; i<=n;++i)
{
fin >> s;
for(int j=1; j<=m; ++j)
{
if(s[j - 1] == '*')
a[i][j] = 1;
else if(s[j - 1] == 'I')
{
intrare.first = i;
intrare.second = j;
}else if(s[j - 1] == 'O')
{
iesire.first = i;
iesire.second = j;
}else if(s[j - 1] == 'D')
{
dragoni.push_back({i, j});
}
}
}
Lee_dragoni(dragoni, n, m);
Lee(intrare, iesire, n, m);
fin.close();
fout.close();
return 0;
}