Pagini recente » Cod sursa (job #3175924) | Cod sursa (job #1852004) | Cod sursa (job #1235048) | Cod sursa (job #2314997) | Cod sursa (job #2244774)
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r, c, x, y, X, Y;
int matrix[1005][1005];
bool visited[1005][1005];
queue < pair <int, int> > Q;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
inline bool ValidPoz(int pozx, int pozy)
{
if(1 <= pozx && pozx <= r)
if(1 <= pozy && pozy <= c)
if(matrix[pozx][pozy] != -1)
return true;
return false;
}
void InitLee()
{
while(!Q.empty())
{
int pozX = Q.front().first;
int pozY = Q.front().second;
Q.pop();
for(int i = 0; i <= 3; i++)
{
int pozXX = pozX + dx[i];
int pozYY = pozY + dy[i];
if(ValidPoz(pozXX, pozYY) && matrix[pozXX][pozYY] == 0)
{
matrix[pozXX][pozYY] = (matrix[pozX][pozY] == -1) ? 1 : matrix[pozX][pozY] + 1;
Q.push(make_pair(pozXX, pozYY));
}
}
}
}
bool Lee(int lmt)
{
if(matrix[x][y] < lmt)
return false;
memset(visited, 0, sizeof(visited));
Q.push(make_pair(x, y));
while(!Q.empty())
{
int pozX = Q.front().first;
int pozY = Q.front().second;
Q.pop();
for(int i = 0; i <= 3; i++)
{
int pozXX = pozX + dx[i];
int pozYY = pozY + dy[i];
if(ValidPoz(pozXX, pozYY) && visited[pozXX][pozYY] == 0 && matrix[pozXX][pozYY] >= lmt)
{
visited[pozXX][pozYY] = 1;
Q.push(make_pair(pozXX, pozYY));
if(pozXX == X && pozYY == y)
{
while(!Q.empty())
Q.pop();
return true;
}
}
}
}
return false;
}
int main()
{
fin >> r >> c;
fin.get();
char s[1005];
for(int i = 1; i <= r; i++)
{
fin.getline(s, 1002);
for(int j = 0; j < c; j++)
if(s[j] == '*')
matrix[i][j + 1] = -1;
else if(s[j] == 'D')
matrix[i][j + 1] = -1, Q.push(make_pair(i, j + 1));
else if(s[j] == 'I')
x = i, y = j + 1;
else if(s[j] == 'O')
X = i, Y = j + 1;
}
InitLee();
int st = 1, dr = 2000, mid, sol = 0;
while(st <= dr)
{
mid = (st + dr) / 2;
if(Lee(mid) == true)
{
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
fout << ((sol == 0) ? -1 : sol) << '\n';
return 0;
}