Pagini recente » Cod sursa (job #1979849) | Cod sursa (job #115370) | Cod sursa (job #471306) | Cod sursa (job #3126084) | Cod sursa (job #1867964)
#include <fstream>
#include <bitset>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
int n, m, i, j, iv,ok, jv , ix, jx, iy, jy,u,p, v[1011][1011],d, maxi,dr,st, mid;
pair<int ,int > s[1011];
bitset<1011> a[1011];
char aux;
int id[4]={0, 0 ,-1 ,1};
int jd[4]={-1, 1, 0, 0};
void fil(int i, int j, int val)
{
int iv, jv,d ;
a[i][j]=0;
if(i==iy&&j==jy)
ok=1;
for(d=0;d<=3;d++)
{
iv=i+id[d];
jv=j+jd[d];
if(v[iv][jv]>=val&&a[iv][jv]==1&&iv>=1&&iv<=n&&jv>=1&&jv<=m)
fil(iv, jv, val);
}
}
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>aux;
if(aux=='.')
v[i][j]=-1;
else
if(aux=='*')
v[i][j]=-2;
else
if(aux=='D')
{
u++;
s[u].first=i;
s[u].second=j;
v[i][j]=1;
}
else
if(aux=='I')
{
v[i][j]=-1;
ix=i;
jx=j;
}
else
{
v[i][j]=-1;
iy=i;
jy=j;
}
}
p=1;
while(p<=u)
{
i=s[p].first;
j=s[p].second;
for(d=0;d<=3;d++)
{
iv=i+id[d];
jv=j+jd[d];
if(v[iv][jv]==-1)
{
v[iv][jv]=1+v[i][j];
if(v[iv][jv]>maxi)
maxi=v[iv][jv];
u++;
s[u].first=iv;
s[u].second=jv;
}
}
p++;
}
st=1;
dr=maxi;
while(st<=dr)
{
mid=(st+dr)/2;
for(i=1;i<=n;i++)
a[i]=~std::bitset<1011>();
ok=0;
if(v[ix][jx]>=mid)
fil(ix, jx, mid);
if(ok==0)
dr=mid-1;
else
st=mid+1;
}
fout<<dr-1;
fin.close();
fout.close();
return 0;
}