Pagini recente » Cod sursa (job #2155875) | Cod sursa (job #410402) | Cod sursa (job #1941678) | Cod sursa (job #2760118) | Cod sursa (job #1000384)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
#include <string.h>
#define x first
#define y second
//#define debug
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int LEE = 1005,
dx[4] = {1, 0, -1, 0},
dy[4] = {0, 1, 0, -1};
int n, m, d[LEE][LEE];
char s[LEE][LEE];
bool viz[LEE][LEE];
queue < pair<int, int> > Q;
pair<int, int> Source, Sink;
inline bool check(int minnow)
{
while(!Q.empty())
Q.pop();
if(d[Source.x][Source.y] < minnow)
return false;
memset(viz, false, sizeof(viz));
for(Q.push(Source) ; !Q.empty() ; Q.pop() )
{
pair<int, int> act = Q.front();
if(act == Sink)
return true;
for(int i = 0 ; i < 4; ++ i)
{
int xnou = act.x + dx[i];
int ynou = act.y + dy[i];
if(xnou >= 1 && ynou >= 1 && xnou <= n && ynou <= m && d[xnou][ynou] >= minnow && !viz[xnou][ynou] && s[xnou][ynou] != '*')
{
viz[xnou][ynou] = true;
Q.push(make_pair(xnou, ynou));
}
}
}
return false;
}
inline int bs(int st, int dr)
{
int mij, fin = 0;
while(st <= dr)
{
mij = ((st+dr) >> 1);
if(check(mij))
{
fin = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return fin;
}
inline void bfs()
{
for( pair<int, int> x = Q.front() ; !Q.empty() ; Q.pop(), x = Q.front() )
for(int i = 0 ; i < 4 ; ++ i)
{
int xnou = x.x + dx[i];
int ynou = x.y + dy[i];
if( xnou >= 1 && ynou >= 1 && xnou <= n && ynou <= m && !d[xnou][ynou] && s[xnou][ynou] != '*')
{
d[xnou][ynou] = d[x.x][x.y] + 1;
Q.push(make_pair(xnou, ynou));
}
}
}
int main()
{
cin >> n >> m;
cin.get();
for(int i = 1 ; i <= n ; ++ i)
{
cin.getline(s[i]+1, LEE);
for(int j = 1 ; j <= m ; ++ j)
switch(s[i][j])
{
case('I'):
Source.x = i;
Source.y = j;
break;
case('O'):
Sink.x = i;
Sink.y = j;
break;
case('D'):
d[i][j] = 1;
Q.push(make_pair(i, j));
break;
}
}
bfs();
#ifdef debug
for(int i = 1 ; i <= n ; ++ i, cout << '\n')
for(int j = 1 ; j <= m ; ++ j)
cout << d[i][j] << ' ';
#endif
cout << bs(0, n+m) - 1 << "\n";
return 0;
}