Pagini recente » Cod sursa (job #964032) | Cod sursa (job #96783) | Cod sursa (job #1992887) | Cod sursa (job #2005390) | Cod sursa (job #567056)
Cod sursa(job #567056)
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const char in[]="barbar.in";
const char out[]="barbar.out";
const int Max_N = 1<<10;
const int INF = 0x3f3f3f3f;
#define mp make_pair
#define x first
#define y second
pair<int, int> O, I, Q[Max_N * Max_N * 2];
int d[Max_N][Max_N], N, M;
char s[Max_N];
bool in_d[Max_N][Max_N];
const int dx[] = { 0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
void get_d()
{
for(int j = 1 ; j <= Q[0].x ; ++j)
for(int i = 0 ; i < 4 ; ++i)
{
int xx = dx[i] + Q[j].x;
int yy = dy[i] + Q[j].y;
if(xx > 0 && xx <= N && yy > 0 && yy <= M && d[xx][yy] != -1 && d[Q[j].x][Q[j].y] + 1 < d[xx][yy])
{
d[xx][yy] = d[Q[j].x][Q[j].y] + 1;
Q[++Q[0].x] = mp(xx, yy);
}
}
}
bool ver(int val)
{
if(d[I.x][I.y] < val)return false;
Q[Q[0].x = 1] = mp(I.x, I.y);
memset(in_d, false, sizeof(in_d));
for(int j = 1 ; j <= Q[0].x ; ++j)
for(int i = 0 ; i < 4 ; ++i)
{
int xx = dx[i] + Q[j].x;
int yy = dy[i] + Q[j].y;
if(xx > 0 && xx <= N && yy > 0 && yy <= M && d[xx][yy] != -1 && d[xx][yy] >= val && !in_d[xx][yy])
{
Q[++Q[0].x] = mp(xx, yy);
in_d[xx][yy] = true;
if(xx == O.x && yy == O.y)
return true;
}
}
return false;
}
int bin_S()
{
int mid, lo = 1, hi = N + M + 1, sol = -1;
while(lo <= hi)
{
mid = lo + (hi - lo) / 2;
if(ver(mid))
{
sol = mid, lo = mid + 1;
}
else hi = mid - 1;
}
return sol;
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d %d", &N, &M );
memset(d, INF, sizeof(d));
for(int i = 1 ; i <= N ; ++i)
{
scanf("%s", s + 1);
for(int j = 1 ; j <= M ; ++j)
{
if(s[j] == 'D')
{
Q[++Q[0].x] = mp(i,j);
d[i][j] = 0;
}
if(s[j] == 'O')
O = mp(i,j);
if(s[j] =='I' ) I = mp(i, j);
if(s[j] == '*')d[i][j] = -1;
}
}
get_d();
printf("%d\n", bin_S());
return 0;
}