Pagini recente » Cod sursa (job #2090713) | Cod sursa (job #1810978) | Cod sursa (job #373193) | Cod sursa (job #1122311) | Cod sursa (job #2971482)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
int n, m, d[1001][1001], x, y, xi, yi, sol;
char s;
short int a[1001][1010];
bool viz[1001][1001];
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
struct coada
{
int l, c;
};
int del(int i, int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
queue <coada> q;
int dx[] = {0, 1, 0, -1, 0};
int dy[] = {0, 0, 1, 0, -1};
int lee(int k)
{
memset(viz, 0, sizeof(viz));
if(d[x][y] >= k)
{
q.push({x,y});
viz[x][y] = 1;
}
else
return 0;
while(!q.empty())
{
int l = q.front().l;
int c = q.front().c;
q.pop();
for(int i = 1; i<=4; i++)
{
int ii = l + dx[i];
int jj = c + dy[i];
if(del(ii,jj) && a[ii][jj] == 0 && viz[ii][jj] == 0 && d[ii][jj] > k)
{
viz[ii][jj] = 1;
q.push({ii,jj});
}
}
}
return viz[xi][yi] == 1;
}
int main()
{
cin >> n >> m;
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
cin >> s;
if(s == 'I')
{
x = i, y = j;
}
else
if(s == '*')
{
a[i][j] = 1;
}
else
if(s == 'D')
{
a[i][j] = 2;
q.push({i,j});
d[i][j] = 1;
}
else
if(s == 'O')
{
xi = i,yi = j;
}
}
}
while(!q.empty())
{
int l = q.front().l;
int c = q.front().c;
q.pop();
for(int i = 1; i<=4; i++)
{
int ii = l + dx[i];
int jj = c + dy[i];
if(del(ii,jj) && a[ii][jj] == 0 && d[ii][jj] == 0)
{
d[ii][jj] = d[l][c] + 1;
q.push({ii,jj});
}
}
}
int st = 0, dr = n * m;
sol = -1;
while(st <= dr)
{
int mid = (dr + st) / 2;
int ok = lee(mid);
if(ok == 1)
{
sol = mid;
st = mid + 1;
}
else
{
dr = mid - 1;
}
}
cout << sol;
return 0;
}