Pagini recente » Cod sursa (job #3003022) | Cod sursa (job #1362822) | Cod sursa (job #1906027) | Cod sursa (job #3164035) | Cod sursa (job #2082902)
#include <fstream>
#include <deque>
using namespace std;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
struct nod
{
int lin,col;
int pericol;
nod()
{
lin=0;
col=0;
pericol=0;
}
};
int r,c;
char m[1005][1005];
bool viz[1005][1005];
int pericol[1005][1005];
deque<nod> coada;
int lin_plec,col_plec;
int lin_ies,col_ies;
void bf()
{
int i;
nod aux;
while(!coada.empty())
{
for(i=0;i<4;i++)
{
if(((coada.front().lin+dy[i])<r) && ((coada.front().lin+dy[i])>=0) && ((coada.front().col+dx[i])<c) && ((coada.front().col+dx[i])>=0) && !viz[coada.front().lin+dy[i]][coada.front().col+dx[i]])
{
viz[coada.front().lin+dy[i]][coada.front().col+dx[i]]=1;
pericol[coada.front().lin+dy[i]][coada.front().col+dx[i]]=coada.front().pericol+1;
aux.lin=coada.front().lin+dy[i];
aux.col=coada.front().col+dx[i];
aux.pericol=coada.front().pericol+1;
coada.push_back(aux);
}
}
coada.pop_front();
}
}
void init_viz()
{
int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
if(m[i][j]=='*')
viz[i][j]=1;
else
viz[i][j]=0;
}
void init_coada()
{
while(!coada.empty())
coada.pop_front();
}
bool posibil(int minim)
{
int i;
init_viz();
init_coada();
nod aux;
aux.lin=lin_plec;
aux.col=col_plec;
coada.push_back(aux);
bool reusit=false;
while(!coada.empty())
{
for(i=0;i<4;i++)
{
if(((coada.front().lin+dy[i])<r) && ((coada.front().lin+dy[i])>=0) && ((coada.front().col+dx[i])<c) && ((coada.front().col+dx[i])>=0) && !viz[coada.front().lin+dy[i]][coada.front().col+dx[i]] && pericol[coada.front().lin+dy[i]][coada.front().col+dx[i]]>=minim)
{
if((coada.front().lin+dy[i])==lin_ies && (coada.front().col+dx[i])==col_ies)
{
reusit=true;
break;
}
viz[coada.front().lin+dy[i]][coada.front().col+dx[i]]=1;
aux.lin=coada.front().lin+dy[i];
aux.col=coada.front().col+dx[i];
coada.push_back(aux);
}
}
coada.pop_front();
}
return reusit;
}
int main()
{
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin>>r>>c;
if(r==c && r==1)
fout<<"-1\n",fin.close(),fout.close();
int i,j;
for(i=0;i<r;i++)
fin.get(),fin.get(m[i],1005);
nod aux;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
if(m[i][j]=='D')
{
aux.lin=i;
aux.col=j;
aux.pericol=0;
viz[i][j]=1;
coada.push_back(aux);
}
else if(m[i][j]=='*')
viz[i][j]=1;
else if(m[i][j]=='I')
lin_plec=i,col_plec=j;
else if(m[i][j]=='O')
lin_ies=i,col_ies=j;
bf();
int st,dr,mijl,raspuns=-1;
st=0;
dr=pericol[lin_plec][col_plec];
mijl=dr>>1;
while(st<=dr)
{
if(posibil(mijl))
{
if(mijl>raspuns)
raspuns=mijl;
st=mijl+1;
}
else
dr=mijl-1;
mijl=(st+dr)>>1;
}
fout<<raspuns<<'\n';
fin.close();
fout.close();
return 0;
}