Pagini recente » Cod sursa (job #1495265) | Cod sursa (job #1528532) | Cod sursa (job #2940433) | Cod sursa (job #321852) | Cod sursa (job #2775216)
#include <iostream>
#include <fstream>
#include <queue>
#define nmax 1005
using namespace std;
struct coord{
int lin;
int col;
};
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
ifstream f;
ofstream g;
queue<coord> coada;
char A[nmax][nmax];
int D[nmax][nmax],n,m,i1,j1,i2,j2,sol;
void READ()
{
f.open("barbar.in",ios::in);
f>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f>>A[i][j];
switch(A[i][j]){
case 'I':{
i1=i;
j1=j;
}break;
case 'O':{
i2=i;
j2=j;
}break;
}
}
}
f.close();
return;
}
inline bool INMAT(int x,int y)
{
return(x>=1&&x<=n&&y>=1&&y<=m);
}
bool BFS(int range)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
switch(A[i][j]){
case '*':{
D[i][j]=-1;
}break;
case 'D':{
D[i][j]=1;
coada.push({i,j});
}break;
case 'I':{
D[i][j]=1;
}break;
case 'O':{
D[i][j]=0;
}break;
case '.':{
D[i][j]=0;
}break;
}
}
}
while(!coada.empty())
{
int is=coada.front().lin;
int js=coada.front().col;
coada.pop();
if(D[is][js]<range)
{for(int i=0;i<=3;i++)
{
int inou=is+dx[i];
int jnou=js+dy[i];
if(INMAT(inou,jnou)&&D[inou][jnou]==0)
{
D[inou][jnou]=D[is][js]+1;
coada.push({inou,jnou});
}
}
}
}
if(D[i2][j2])
return false;
else{
coada.push({i1,j1});
while(!coada.empty())
{
int is=coada.front().lin;
int js=coada.front().col;
coada.pop();
for(int i=0;i<=3;i++)
{
int inou=is+dx[i];
int jnou=js+dy[i];
if(INMAT(inou,jnou)&&D[inou][jnou]==0)
{
D[inou][jnou]=D[is][js]+1;
coada.push({inou,jnou});
}
}
}
return(D[i2][j2]);
}
}
void BINARY()
{
g.open("barbar.out",ios::out);
int st=1;
int dr=n*n;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(BFS(mid))
st=mid+1,sol=mid;
else dr=mid-1;
}
if(sol)
g<<sol;
else g<<-1;
g.close();
return;
}
int main()
{
std :: ios_base :: sync_with_stdio(false);
std :: cin.tie(0);
READ();
BINARY();
return 0;
}