Pagini recente » Cod sursa (job #302062) | Cod sursa (job #969458) | Cod sursa (job #2792900) | Cod sursa (job #2089996) | Cod sursa (job #2321428)
#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[10000];
char chr;
queue <short> x[10000],y[10000];
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]){
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)];
viz[x[i].front()+1][y[i].front()] = 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)];
viz[x[i].front()-1][y[i].front()] = 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)];
viz[x[i].front()][y[i].front()+1] = 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)];
viz[x[i].front()][y[i].front()-1] = min(M[x[i].front()][y[i].front()-1],i);
}
x[i].pop();
y[i].pop();
--dim[i];
}
--i;
}
afis();
g << "\n";
afisviz();
g << "\n";
if(viz[ox][oy]>1) g << viz[ox][oy]-1;
else g << -1;
return 0;
}