Pagini recente » Cod sursa (job #3238880) | Cod sursa (job #98399) | Cod sursa (job #2552363) | Cod sursa (job #250350) | Cod sursa (job #3274919)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, d[1003][1003];
char a[1003][1003];
bitset<1003> viz[1003];
int xi, yi, xo, yo;
queue< pair<int, int> > q;
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
void Citire()
{
int i, j;
string s;
fin >> n >> m;
for (i = 1; i <= n; i++)
{
fin >> s;
for (j = 0; j < m; j++)
{
a[i][j + 1] = s[j];
if (s[j] == 'I')
{
xi = i; yi = j + 1;
}
else if (s[j] == 'O')
{
xo = i; yo = j + 1;
}
}
}
}
void Bordare()
{
int i, j;
/// coloanele 0 si m + 1
for (i = 0; i <= n + 1; i++)
a[i][0] = a[i][m + 1] = '*';
/// liniile 0 si n + 1
for (j = 0; j <= m + 1; j++)
a[0][j] = a[n + 1][j] = '*';
}
void Lee()
{
int i, j, x, y, p;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
{
d[i][j] = 2000000;
if (a[i][j] == 'D')
{
q.push({i,j});
d[i][j] = 0;
}
}
while (!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for (p = 0; p < 4; p++)
{
x = i + dx[p];
y = j + dy[p];
if (a[x][y] != '*' && d[x][y] > d[i][j] + 1)
{
d[x][y] = 1 + d[i][j];
q.push({x, y});
}
}
}
}
bool Fill(int dist)
{
int i, j, x, y, p;
for(i = 1; i <= n; i++)
viz[i].reset();
stack < pair<int, int> > st;
st.push({xi, yi});
viz[xi][yi] = 1;
while(!st.empty())
{
i = st.top().first;
j = st.top().second;
st.pop();
for(p = 0; p < 4; p++)
{
x = i + dx[p];
y = j + dy[p];
if(a[x][y] != '*' && !viz[x][y] && d[x][y] >= dist)
{
viz[x][y] = 1;
st.push({x, y});
}
}
}
if(viz[xo][yo] == 1) return true;
return false;
}
void CB()
{
int st, dr, mij, dist = -1;
st = 1;
dr = min(d[xi][yi], d[xo][yo]);
while(st <= dr)
{
mij = (st + dr) / 2;
if(Fill(mij))
{
dist = mij;
st = mij + 1;
}
else dr = mij - 1;
}
fout << dist;
}
int main()
{
Citire();
Bordare();
Lee();
CB();
return 0;
}