Pagini recente » Cod sursa (job #3337569) | Cod sursa (job #3308991) | Cod sursa (job #1406798) | Cod sursa (job #772078) | Cod sursa (job #3310517)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1005;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
const int INF = 1e9;
int n, m, i, j;
int mat[NMAX][NMAX], le[NMAX][NMAX];
char cr;
queue<pair<int,int>> q;
void lee1()
{
while(!q.empty())
{
int x = q.front().first, y = q.front().second;
q.pop();
for(int k = 0; k < 4; k++)
{
int nx = x + dx[k], ny = y + dy[k];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m &&
mat[nx][ny] != 0 && le[nx][ny] > le[x][y] + 1)
{
le[nx][ny] = le[x][y] + 1;
q.push({nx, ny});
}
}
}
}
bool lee2(int val, pair<int,int> start, pair<int,int> exit)
{
vector<vector<bool>> visited(n+1, vector<bool>(m+1,false));
queue<pair<int,int>> qq;
qq.push(start);
visited[start.first][start.second] = true;
while(!qq.empty())
{
int x = qq.front().first, y = qq.front().second;
qq.pop();
if(x == exit.first && y == exit.second)
return true;
for(int k = 0; k < 4; k++)
{
int nx = x + dx[k], ny = y + dy[k];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m &&
!visited[nx][ny] && mat[nx][ny] != 0 && le[nx][ny] >= val)
{
visited[nx][ny] = true;
qq.push({nx, ny});
}
}
}
return false;
}
int maxdist()
{
int mx = 0;
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
if(le[i][j] < INF)
mx = max(mx, le[i][j]);
return mx;
}
int cautbin(pair<int,int> start, pair<int,int> exit)
{
int st = 0, dr = maxdist(), rasp = -1;
while(st <= dr)
{
int mid = (st + dr)/2;
if(lee2(mid, start, exit))
{
rasp = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
return rasp;
}
int main()
{
pair<int,int> start, exit;
fin >> n >> m;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
fin >> cr;
switch(cr)
{
case '.':
mat[i][j] = -1;
le[i][j] = INF;
break;
case 'I':
mat[i][j] = -1;
le[i][j] = INF;
start = {i,j};
break;
case 'O':
mat[i][j] = -1;
le[i][j] = INF;
exit = {i,j};
break;
case 'D':
mat[i][j] = -2;
le[i][j] = 0;
q.push({i,j});
break;
case '*':
mat[i][j] = 0;
le[i][j] = -1;
break;
}
}
}
lee1();
int raspuns = cautbin(start, exit);
fout << raspuns;
fin.close();
fout.close();
return 0;
}