Pagini recente » Cod sursa (job #1139366) | Cod sursa (job #1524557) | Cod sursa (job #390800) | Cod sursa (job #1371779) | Cod sursa (job #1867778)
#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[1001][1001],d, maxi,dr,st, mid;
pair<int ,int > s[1001];
bitset<1001> a[1001];
char aux;
int id[]={0, 0 ,-1 ,1};
int jd[]={-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]=-3;
ix=i;
jx=j;
}
else
{
v[i][j]=-1;
iy=i;
jy=i;
}
}
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<1001>();
ok=0;
fil(ix, jx, mid);
if(ok==0)
dr=mid-1;
else
st=mid+1;
}
fout<<dr-1;
fin.close();
fout.close();
return 0;
}