Pagini recente » Cod sursa (job #657249) | Cod sursa (job #1573774) | Cod sursa (job #1180387) | Cod sursa (job #2735945) | Cod sursa (job #2244805)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int R, C, x1, y1, x2, y2;
int matrixDist[1005][1005];
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
bool vis[1005][1005], avalabile[1005][1005];
queue < pair < int, int > > Q;
void InitLee()
{
while(!Q.empty())
{
int x = Q.front().first;
int y = Q.front().second;
Q.pop();
for(int i = 0; i < 4; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx && yy && xx <= R && yy <= C)
if(vis[xx][yy] == false && avalabile[xx][yy] == false)
{
vis[xx][yy] = true;
matrixDist[xx][yy] = matrixDist[x][y] + 1;
Q.push(make_pair(xx, yy));
}
}
}
}
bool Lee(int lmt)
{
if(matrixDist[x1][y1] < lmt)
return false;
memset(vis, 0, sizeof(vis));
vis[x1][y1] = true;
Q.push(make_pair(x1, y1));
while(!Q.empty())
{
int x = Q.front().first;
int y = Q.front().second;
Q.pop();
for(int i = 0; i < 4; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx && yy && xx <= R && yy <= C)
if(matrixDist[xx][yy] >= lmt && vis[xx][yy] == false && avalabile[xx][yy] == false)
{
vis[xx][yy] = true;
Q.push(make_pair(xx, yy));
if(xx == x2 && yy == y2)
{
while(!Q.empty())
Q.pop();
return true;
}
}
}
}
return false;
}
int main()
{
fin >> R >> C;
char s[1005];
for(int i = 1; i <= R; i++)
{
fin >> s;
for(int j = 0; j < C; j++)
{
if(s[j] == '*')
avalabile[i][j + 1] = true;
else if(s[j] == 'I')
x1 = i, y1 = j + 1;
else if(s[j] == 'O')
x2 = i, y2 = j + 1;
else if(s[j] == 'D')
vis[i][j + 1] = true, Q.push(make_pair(i, j + 1));
}
}
InitLee();
int st = 0, dr = 2000, mid, sol = -1;
while(st <= dr)
{
mid =(st + dr) / 2;
if(Lee(mid) == true)
{
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
fout << sol;
return 0;
}