Pagini recente » Cod sursa (job #1276416) | Cod sursa (job #27800) | Cod sursa (job #2673683) | Cod sursa (job #1616997) | Cod sursa (job #3242541)
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
#define fr first
#define sc second
#define pb push_back
#define pf push_front
bool fct(int dst, vector<int> &dist, vector<vector<int>> &vec, int in, int out)
{
if(dist[in] < dst || dist[out] < dst)
return false;
queue<int> bfs;
vector<bool> f(vec.size(), false);
bfs.push(in);
while(!bfs.empty())
{
int nod = bfs.front();
bfs.pop();
for(auto i : vec[nod])
if(!f[i] && dist[i] >= dst)
f[i] = true, bfs.push(i);
}
return f[out];
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int r, c, in, out;
cin >> r >> c;
vector<char> mat(r * c);
vector<vector<int>> vec(r * c);
vector<int> dist(r * c, 1e9);
queue<int> bfs;
vector<bool> f(r * c);
for(int i = 0; i < r; i ++)
for(int j = 0; j < c; j ++)
{
int pos = i * c + j;
char ch;
cin >> ch;
mat[pos] = ch;
if(ch == 'D')
dist[pos] = 0, bfs.push(pos), f[pos] = true;
if(ch == 'I')
in = pos;
if(ch == 'O')
out = pos;
if(ch != '*' && j > 0 && mat[pos - 1] != '*')
vec[pos - 1].push_back(pos), vec[pos].push_back(pos - 1);
if(ch != '*' && i > 0 && mat[pos - c] != '*')
vec[pos - c].push_back(pos), vec[pos].push_back(pos - c);
}
while(!bfs.empty())
{
int nod = bfs.front();
bfs.pop();
for(auto i : vec[nod])
if(!f[i])
dist[i] = dist[nod] + 1, f[i] = true, bfs.push(i);
}
int pas = 512, pos = 0;
while(pas)
{
if(fct(pos + pas, dist, vec, in, out))
pos += pas;
pas /= 2;
}
cout << pos;
}