Pagini recente » Cod sursa (job #3279938) | Cod sursa (job #307736) | Cod sursa (job #1446151) | Cod sursa (job #452530) | Cod sursa (job #1849541)
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
#include <string.h>
#define x first
#define y second
using namespace std;
const int N = 1005;
int dx [4] = {1, 0, -1, 0};
int dy [4] = {0, 1, 0, -1};
int n, m, d [N][N];
char s [N][N];
bool used[N][N];
queue < pair<int, int> > q;
pair<int, int> source, dest;
bool check(int minnow){
int i, xn, yn;
pair <int, int> nod;
while(!q.empty())
q.pop();
if(d[source.x][source.y] < minnow)
return false;
memset(used, false, sizeof(used));
q.push(source);
while (!q.empty())
{
nod = q.front();
if(nod == dest)
return true;
for(i = 0; i < 4; ++i) {
xn= nod.x + dx [i];
yn = nod.y + dy [i];
if(xn >= 1 && yn >= 1 && xn <= n && yn <= m && d [xn][yn] >= minnow && !used [xn][yn] && s [xn][yn] != '*')
{
used [xn][yn] = true;
q.push(make_pair(xn, yn));
}
}
q.pop();
}
return false;
}
int binarySearch(int st, int dr){
int mij, last = 0;
while (st <= dr){
mij = (st + dr) / 2;
if(check(mij))
{
last = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return last;
}
void bfs(){
int xn, yn, i;
pair <int, int> nod;
while (!q.empty()){
nod = q.front();
q.pop();
for(i = 0; i < 4; ++i) {
xn = nod.x + dx[i];
yn = nod.y + dy[i];
if(xn >= 1 && yn >= 1 && xn <= n && yn <= m && !d [xn][yn] && s [xn][yn] != '*')
{
d [xn][yn] = d[nod.x][nod.y] + 1;
q.push(make_pair(xn, yn));
}
}
}
}
int main() {
int i, j, ans;
freopen ("barbar.in", "r", stdin);
freopen ("barbar.out", "w", stdout);
scanf("%d%d\n", &n, &m);
for (i = 1; i <= n; ++i){
scanf ("%s", s[i] + 1);
for(j = 1; j <= m; ++j)
switch(s[i][j])
{
case('I'):{
source.x = i;
source.y = j;
break;
}
case('O'):{
dest.x = i;
dest.y = j;
break;
}
case('D'):{
d[i][j] = 1;
q.push(make_pair(i, j));
break;
}
}
}
bfs();
ans = binarySearch(0, n + m) - 1;
printf("%d\n", ans);
return 0;
}