Pagini recente » Cod sursa (job #2589128) | Cod sursa (job #964032) | Cod sursa (job #96783) | Cod sursa (job #1992887) | Cod sursa (job #2005390)
#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
const int NMAX = 1000;
char v[1+NMAX+3][1+NMAX+3];
int a[1+NMAX][1+NMAX];
int r,c;
const int iplus[4] = {0,0,-1,1};
const int jplus[4] = {1,-1,0,0};
struct square
{
int x,y;
};
bool operator<(const square &c,const square &b)
{
return a[c.x][c.y] < a[b.x][b.y];
}
priority_queue <square> h;
queue <square> q;
square start,finish;
void makecost()
{
for(int i = 1;i <= r;i ++)
{
for(int j = 1;j <= c;j ++)
{
if(v[i][j] == 'D')
q.push({i,j});
if(v[i][j] == 'I')
{
start = {i,j};
v[i][j] = '.';
}
if(v[i][j] == 'O')
{
finish = {i,j};
v[i][j] = '.';
}
}
}
while(q.size() > 0)
{
square s = q.front();
q.pop();
for(int dir = 0;dir < 4;dir ++)
{
int x = s.x + iplus[dir];
int y = s.y + jplus[dir];
if((v[x][y] == '.' || v[x][y] == 'I' || v[x][y] == 'O') && a[x][y] == 0)
{
a[x][y] = a[s.x][s.y] + 1;
q.push({x,y});
}
}
}
}
bool check[1+NMAX][1+NMAX];
bool drum(int t){
if(a[start.x][start.y] < t || a[finish.x][finish.y] < t)
return 0;
for(int i = 1;i <= r;i ++)
for(int j = 1;j <= c;j ++)
check[i][j] = 0;
while(q.size() > 0)
q.pop();
q.push(start);
while(q.size() > 0){
square s = q.front();
q.pop();
for(int dir = 0;dir < 4;dir ++)
{
int x = s.x + iplus[dir];
int y = s.y + jplus[dir];
if(x == finish.x && y == finish.y)
return 1;
if((v[x][y] == '.' || v[x][y] == 'D') && check[x][y] == 0 && a[x][y] >= t)
{
check[x][y] = 1;
q.push({x,y});
}
}
}
return 0;
}
int cautbin()
{
int r = 0,pas = 1 << 19;
while(pas)
{
if(drum(r+pas) == 1)
r += pas;
pas >>= 1;
}
if(r == 0)
r = -1;
return r;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n",&r,&c);
for(int i = 1;i <= r;i ++)
{
fgets(v[i]+1,NMAX+3,stdin);
//fputs(v[i],stdout);
}
makecost();
printf("%d",cautbin());
return 0;
}