Pagini recente » Cod sursa (job #1557572) | Cod sursa (job #2783309) | Cod sursa (job #2337308) | Cod sursa (job #157312) | Cod sursa (job #2940418)
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n,m;
char a[1005][1005];
queue<pair<int,int>>q;
int dl[] = {-1,0,1,0};
int dc[] = {0,1,0,-1};
bool viz[1005][1005];
int d[1005][1005];
bool mat[1005][1005];
int d2[1005][1005];
int fl,fc,il,ic;
void BFS()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
d[i][j] = 1e9;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j] == 'D')
{
q.push({i,j});
d[i][j] = 0;
viz[i][j] = true;
}
while (!q.empty())
{
int lin = q.front().first;
int col = q.front().second;
q.pop();
for (int i = 0; i < 4; i++)
{
int vecl = lin + dl[i];
int vecc = col + dc[i];
if (!viz[vecl][vecc] and vecl >= 1 and vecl <= n and vecc >= 1 and vecc <= m and a[vecl][vecc] != '*')
{
d[vecl][vecc] = d[lin][col] + 1;
q.push({vecl,vecc});
viz[vecl][vecc] = true;
}
}
}
}
void DFS(int lin,int col)
{
viz[lin][col] = true;
for (int i = 0; i < 4; i++)
{
int vl = lin + dl[i];
int vc = col + dc[i];
if (!viz[vl][vc] and mat[vl][vc] == true)
DFS(vl,vc);
}
}
bool ok(int dist)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (d[i][j] >= dist)
mat[i][j] = true;
else
mat[i][j] = false;
if (a[i][j] == '*' or a[i][j] == 'D')
mat[i][j] = false;
viz[i][j] = false;
}
DFS(il,ic);
return viz[fl][fc];
}
int main()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
in >> a[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j] == 'I')
il = i,ic = j;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j] == 'O')
fl = i,fc = j;
BFS();
int st = -1,pas = 1 << 15;
while (pas != 0)
{
if (ok(st + pas) == true)
st += pas;
pas /= 2;
}
out << st;
return 0;
}