Pagini recente » Cod sursa (job #2825078) | Cod sursa (job #3149112) | Cod sursa (job #682475) | Cod sursa (job #2229062) | Cod sursa (job #2165827)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int di[4]={-1,0,1,0};
int dj[4]={0,1,0,-1};
int r,c,m2[1000][1000],stopx,stopy,m[1000][1000],startx,starty,m3[1000][1000];
char p;
queue < pair < int , int > >coada;
void citire()
{
in>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
in>>p;
if(p=='I')
{
startx=i;
starty=j;
}
else if(p=='O')
{
stopx=i;
stopy=j;
}
else if(p=='D')
{
coada.push(make_pair(i,j));
m[i][j]=1;
}
else if(p=='*')
m[i][j]=-1;
}
}
bool ok(int i ,int j)
{
if(i<1 || j<1 ||i>r || j>c)
return 0;
if(m[i][j]==-1)
return 0;
return 1;
}
void Lee()
{
while(!coada.empty())
{
int i=coada.front().first;
int j=coada.front().second;
coada.pop();
for(int d=0;d<4;d++)
{
int ni=i+di[d];
int nj=j+dj[d];
if(ok(ni,nj) &&(m[ni][nj]==0))
{
m[ni][nj]=m[i][j]+1;
coada.push(make_pair(ni,nj));
}
}
}
}
void matrice()
{
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
m2[i][j]=m3[i][j];
}
bool Lee2(int distanta)
{
matrice();
if(m[startx][starty]-1>=distanta)
{
m2[startx][starty]=1;
coada.push(make_pair(startx,starty));
}
while(!coada.empty())
{
int i=coada.front().first;
int j=coada.front().second;
coada.pop();
for(int d=0;d<4;d++)
{
int ni=i+di[d];
int nj=j+dj[d];
if(ok(ni,nj) &&(m2[ni][nj]==0)&&(m[ni][nj]-1>=distanta))
{
m2[ni][nj]=m2[i][j];
coada.push(make_pair(ni,nj));
}
}
}
if(m2[stopx][stopy]!=0)
return 1;
return 0;
}
void sol()
{
int st=1,dr=r*c,sol=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(Lee2(mij))
{
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
out<<sol;
}
void afisare()
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
cout<<m2[i][j]<<" ";
cout<<"\n";
}
}
int main()
{
citire();
Lee();
sol();
return 0;
}