Pagini recente » Cod sursa (job #1525231) | Cod sursa (job #2589268) | Cod sursa (job #2872206) | Cod sursa (job #1867715) | Cod sursa (job #2107299)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <deque>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,Mem[1005][1005],DistDrag[1005][1005];
int MatLee[1005][1005];
char aux;
int Rl[5]={0,-1,0,1,0};
int Rc[5]={0,0,1,0,-1};
int linie,coloana,aux1,F;
int pornirel,pornirec,iesirel,iesirec,maxd;
int liniev,coloanav,linie1,coloana1;
deque < pair < int, int > > decoada;
void umplere(int,int);
int cbin(int);
bool Lee(int);
int main()
{
fin>>n>>m;
for (linie=1;linie<=n;linie++)
for (coloana=1;coloana<=m;coloana++)
DistDrag[linie][coloana]=999999;
for (linie=0;linie<=n+1;linie++)
Mem[linie][0]=Mem[linie][m+1]=-1;
for (coloana=0;coloana<=m+1;coloana++)
Mem[0][coloana]=Mem[n+1][coloana]=-1;
for (linie=1;linie<=n;linie++)
for (coloana=1;coloana<=m;coloana++)
{
fin>>aux;
if (aux=='I')
{
pornirel=linie;
pornirec=coloana;
}
else if (aux=='O')
{
iesirel=linie;
iesirec=coloana;
}
else if (aux=='D')
{
umplere(linie,coloana);
DistDrag[linie][coloana]=0;
}
else if (aux=='*')
Mem[linie][coloana]=9999999;
}
for (linie=1;linie<=n;linie++)
for (coloana=1;coloana<=m;coloana++)
if (maxd<DistDrag[linie][coloana])
maxd=DistDrag[linie][coloana];
F=cbin(maxd);
fout<<-1;
return 0;
}
void umplere(int linieD,int coloanaD)
{
int stl,sfl,stc,sfc,i,d;
stl=linieD-1;
sfl=linieD+1;
stc=coloanaD-1;
sfc=coloanaD+1;
d=1;
while (stl>=1||sfl<=n||stc>=1||sfc<=m)
{
stl=max(1,stl);
sfl=min(n,sfl);
stc=max(1,stc);
sfc=min(m,sfc);
for (i=stc;i<=sfc;i++)
DistDrag[stl][i]=min(DistDrag[stl][i],d);
for (i=stl;i<=sfl;i++)
DistDrag[i][stc]=min(DistDrag[i][stc],d);
for (i=stc;i<=sfc;i++)
DistDrag[sfl][i]=min(DistDrag[sfl][i],d);
for (i=stl;i<=sfl;i++)
DistDrag[i][sfc]=min(DistDrag[i][sfc],d);
d++;
stl--;
sfl++;
stc--;
sfc++;
}
}
int cbin(int max1)
{
int st,sf,mij,aux,ok;
aux=0;
st=0;
sf=max1;
while (st<=sf)
{
mij=(st+sf)/2;
if (Lee(mij))
{
aux=mij;
ok=1;
st=mij+1;
}
else
sf=mij-1;
}
if (ok==1)
return aux;
else
return -1;
}
bool Lee(int aux1)
{
int i;
decoada.begin();
decoada.push_back(make_pair(pornirel,pornirec));
for (liniev=1;liniev<=n;liniev++)
for (coloanav=1;coloanav<=m;coloanav++)
MatLee[liniev][coloanav]=Mem[liniev][coloanav];
MatLee[pornirel][pornirec]=1;
while (!decoada.empty()&&MatLee[iesirel][iesirec]==0)
{
linie1=decoada.front().first;
coloana1=decoada.front().second;
decoada.pop_front();
for (i=1;i<=4;i++)
{
liniev=linie1+Rl[i];
coloanav=coloana1+Rc[i];
if (MatLee[liniev][coloanav]==0&&DistDrag[liniev][coloanav]>=aux1)
{
MatLee[liniev][coloanav]=MatLee[linie1][coloana1]+1;
decoada.push_back(make_pair(liniev,coloanav));
}
}
}
if (MatLee[iesirel][iesirec]!=0)
return 1;
else
return 0;
}