Pagini recente » Profil Anamaria_Carina | Cod sursa (job #2470088) | Cod sursa (job #2394034) | Cod sursa (job #1224513) | Cod sursa (job #2316521)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
short viz[1002][1002];
short M[1002][1002],i,j,px,py,L,C,ox,oy,dim[3001];
char chr;
queue <short> x[3001],y[3001];
void afis(){
for(short o=1;o<=L;++o){
for(short k=1;k<=C;++k)
g << M[o][k] << " ";
g << "\n";}
}
void afisviz(){
for(short o=1;o<=L;++o){
for(short k=1;k<=C;++k)
g << viz[o][k] << " ";
g << "\n";}
}
int main()
{
f >> L >> C;
for(i=0;i<=L+1;++i){
M[i][0] = -1;
M[i][C+1] = -1;}
for(i=0;i<=C+1;++i){
M[0][i] = -1;
M[L+1][i] = -1;}
for(i=1;i<=L;++i)
for(j=1;j<=C;++j){
f >> chr;
if(chr!='.')
if(chr=='D') {x[0].push(i); y[0].push(j); M[i][j]=1; ++dim[0];}
else if(chr=='*') M[i][j] = -1;
else if(chr=='I') {px = i; py = j;}
else {ox = i; oy = j;}
}
while(dim[0]!=0){
if(M[x[0].front()+1][y[0].front()]==0){
M[x[0].front()+1][y[0].front()] = M[x[0].front()][y[0].front()]+1;
x[0].push(x[0].front()+1);
y[0].push(y[0].front());
++dim[0];
}
if(M[x[0].front()-1][y[0].front()]==0){
M[x[0].front()-1][y[0].front()] = M[x[0].front()][y[0].front()]+1;
x[0].push(x[0].front()-1);
y[0].push(y[0].front());
++dim[0];
}
if(M[x[0].front()][y[0].front()+1]==0)
{M[x[0].front()][y[0].front()+1] = M[x[0].front()][y[0].front()]+1;
x[0].push(x[0].front());
y[0].push(y[0].front()+1);
++dim[0];
}
if(M[x[0].front()][y[0].front()-1]==0)
{M[x[0].front()][y[0].front()-1] = M[x[0].front()][y[0].front()]+1;
x[0].push(x[0].front());
y[0].push(y[0].front()-1);
++dim[0];
}
x[0].pop();
y[0].pop();
--dim[0];
}
x[M[px][py]].push(px);
y[M[px][py]].push(py);
i = M[px][py];
++dim[i];
while(i){
while(dim[i]){
viz[x[i].front()][y[i].front()] = max(viz[x[i].front()][y[i].front()],i);
if((M[x[i].front()+1][y[i].front()]>0)&&(viz[x[i].front()+1][y[i].front()]==0)){
x[min(M[x[i].front()+1][y[i].front()],i)].push(x[i].front()+1);
y[min(M[x[i].front()+1][y[i].front()],i)].push(y[i].front());
++dim[min(M[x[i].front()+1][y[i].front()],i)];
}
if((M[x[i].front()-1][y[i].front()]>0)&&(viz[x[i].front()-1][y[i].front()]==0)){
x[min(M[x[i].front()-1][y[i].front()],i)].push(x[i].front()-1);
y[min(M[x[i].front()-1][y[i].front()],i)].push(y[i].front());
++dim[min(M[x[i].front()-1][y[i].front()],i)];
}
if((M[x[i].front()][y[i].front()+1]>0)&&(viz[x[i].front()][y[i].front()+1]==0)){
x[min(M[x[i].front()][y[i].front()+1],i)].push(x[i].front());
y[min(M[x[i].front()][y[i].front()+1],i)].push(y[i].front()+1);
++dim[min(M[x[i].front()][y[i].front()+1],i)];
}
if((M[x[i].front()][y[i].front()-1]>0)&&(viz[x[i].front()][y[i].front()-1]==0)){
x[min(M[x[i].front()][y[i].front()-1],i)].push(x[i].front());
y[min(M[x[i].front()][y[i].front()-1],i)].push(y[i].front()-1);
++dim[min(M[x[i].front()][y[i].front()-1],i)];
}
x[i].pop();
y[i].pop();
--dim[i];
}
--i;
}
if(viz[ox][oy]>1) g << viz[ox][oy]-1;
else g << -1;
return 0;
}