Pagini recente » Cod sursa (job #711501) | Cod sursa (job #894225) | Cod sursa (job #22820) | Cod sursa (job #2285946) | Cod sursa (job #2444916)
#include <bits/stdc++.h>
const int bomba = 2000000000;
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n , m;
char a[1005][1005];
int b[1005][1005] , c[1005][1005];
int dx[] = {-1 , 0 , 0 , 1};
int dy[] = {0 , -1, 1 , 0};
int xi ,yi , xf, yf;
queue<pair<int , int> > q;
void Read()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> (a[i] + 1);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(a[i][j] == 'I')
{
xi = i;
yi = j;
}
else if(a[i][j] == 'O')
{
xf = i;
yf = j;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
b[i][j] = bomba;
}
inline bool Check(int x, int y)
{
return (x >= 1 && x <= n && y >= 1 && y <= m);
}
void Init()
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
c[i][j] = bomba;
}
void Lee_dragoni()
{
int i , j , x , y ,k;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(a[i][j] == 'D')
{
b[i][j] = 1;
q.push({i,j});
}
while(!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for(k = 0; k <= 3; k++)
{
x = dx[k] + i;
y = dy[k] + j;
if(Check(x,y) && a[x][y] != '*' && b[x][y] > b[i][j] + 1)
{
b[x][y] = b[i][j] + 1;
q.push({x,y});
}
}
}
}
bool Lee_paftene(int dist)
{
Init();
int i , j , x , y , k;
c[xi][yi] = 0;
q.push({xi , yi});
while(!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for(k = 0; k <= 3; k++)
{
x = dx[k] + i;
y = dy[k] + j;
if(Check(x,y) && a[x][y] != '*' && b[x][y] > dist &&
c[x][y] > c[i][j] + 1)
{
c[x][y] = c[i][j] + 1;
q.push({x , y});
}
}
}
return !(c[xf][yf]==bomba);
}
void Caut_bin()
{
int st=1,dr=5005,mij,sol;
while(st<=dr)
{
mij=(st+dr)/2;
if(Lee_paftene(mij))
{
sol=mij;
st=mij+1;
}
else dr=mij-1;
}
fout<<sol<<"\n";
}
int main()
{
Read();
Lee_dragoni();
Caut_bin();
/**
for(int i = 1; i <= n;i++,cout<<"\n")
for(int j = 1; j <= m; j++)
cout<<(b[i][j]==bomba ? 0:b[i][j])<<" ";
*/
return 0;
}