Pagini recente » Cod sursa (job #3173570) | Cod sursa (job #1647078) | Cod sursa (job #1785533) | Cod sursa (job #188057) | Cod sursa (job #1686026)
#include <iostream>
#include <fstream>
#include <queue>
#define DM 1001
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
queue <int> qx,qy;
const int dx[]={-1,0,1,0}, dy[]={0,1,0,-1};
int n,m,mat[DM][DM],xi,yi,xs,ys,maxx,le[DM][DM];
char v[DM],a[DM][DM];
void pfill()
{
while(qx.size())
{
int x=qx.front();
int y=qy.front();
qx.pop();
qy.pop();
for(int k=0;k<=3;k++)
{
int xx=x+dx[k];
int yy=y+dy[k];
if(xx && yy && xx<=n && yy<=m && mat[xx][yy]==0)
{
mat[xx][yy]=mat[x][y]+1;
maxx=max(maxx,mat[xx][yy]);
qx.push(xx);
qy.push(yy);
}
}
}
}
void goleste()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
le[i][j]=0;
}
bool verif(int res)
{
le[xi][yi]=1;
qx.push(xi);
qy.push(yi);
while(qx.size())
{
int x=qx.front();
int y=qy.front();
qx.pop();
qy.pop();
for(int k=0;k<=3;k++)
{
int xx=x+dx[k];
int yy=y+dy[k];
if(xx && yy && xx<=n && yy<=m && mat[xx][yy]>=res && mat[xx][yy]>1 && le[xx][yy]==0)
{
le[xx][yy]=1;
qx.push(xx);
qy.push(yy);
}
}
}
if(le[xs][ys]==1) return 1;
else return 0;
}
int caut_bin()
{
int lo=1,hi=maxx,mi;
while(lo<=hi)
{
mi=(lo+hi)/2;
if(verif(mi)==0) hi=mi-1;
else lo=mi+1;
goleste();
}
return hi;
}
int main()
{
f>>n>>m; f.get();
for(int i=1;i<=n;i++)
{
f.getline(a[i]+1,m+2);
for(int j=1;j<=m;j++)
{
if(a[i][j]=='I')
{
xi=i;
yi=j;
}
if(a[i][j]=='O')
{
xs=i;
ys=j;
}
if(a[i][j]=='D')
{
qx.push(i);
qy.push(j);
mat[i][j]=1;
}
if(a[i][j]=='*')
mat[i][j]=-1;
}
}
pfill();
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<mat[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
cout<<verif(8)<<"\n";
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<le[i][j]<<" ";
cout<<"\n";
}*/
goleste();
g<<caut_bin()-1;
return 0;
}