Cod sursa(job #1409751)

Utilizator madatiutiuTiutiu Madalin madatiutiu Data 30 martie 2015 18:15:55
Problema Traseu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>

using namespace std;

ifstream f("Traseu.in");
ofstream g("Traseu.out");

int N,M,k1,l1,c1,k2,l2,c2,x,y,z,k,l,c,a[100][100][100],n,T;
int o,prim,ultim;
int dk[]={-1,0,0,0,0,1};
int dl[]={0,-1,0,0,1,0};
int dc[]={0,0,-1,1,0,0};

struct punct
{
    short ki,li,ci;
}
B[1000000];

void lee()
{
    punct p,v;
    prim=ultim=0;
    B[0].ki=k1;
    B[0].li=l1;
    B[0].ci=c1;
    a[k1][l1][c1]=1;
    while(prim<=ultim && a[k2][l2][c2]==0)
    {
        p=B[prim];
        prim++;
        for(o=0;o<6;o++)
        {
            v.ki=p.ki+dk[o];
            v.li=p.li+dl[o];
            v.ci=p.ci+dc[o];
            if(a[v.ki][v.li][v.ci]==0)
            {
                ultim++;
                a[v.ki][v.li][v.ci]=a[p.ki][p.li][p.ci]+1;
                B[ultim]=v;
            }
        }
    }


}
void bordare()
{
    int i,j;
    for(i=0;i<=N+1;i++)
        for(j=0;j<=N+1;j++)
           {
               a[0][i][j]=-1;
               a[n+1][i][j]=-1;
               a[i][0][j]=-1;
               a[i][n+1][j]=-1;
               a[i][j][0]=-1;
               a[i][j][n+1]=-1;
           }
}
void drum(int x, int y, int z, int val)
{
   if(val>1)
   {
       if (a[x-1][y][z]==val-1)
            drum(x-1,y,z,val-1);
       else
            if (a[x][y-1][z]==val-1)
                drum(x,y-1,z,val-1);
            else
                 if (a[x][y][z-1]==val-1)
                     drum(x,y,z-1,val-1);
                 else
                     if (a[x][y][z+1]==val-1)
                         drum(x,y,z+1,val-1);
                     else
                         if (a[x][y+1][z]==val-1)
                            drum(x,y+1,z,val-1);
                        else
                            if (a[x+1][y][z]==val-1)
                                drum(x+1,y,z,val-1);
     g<<x<<" "<<y<<" "<<z<<"\n";
   }
}

int main()
{
    f>>N>>M;
    f>>k1>>l1>>c1;
    f>>k2>>l2>>c2;
    for(k=1;k<=N;k++)
        for(l=1;l<=N;l++)
            for(c=1;c<=N;c++)
                 a[k][l][c]=0;
    for(n=1;n<=M;n++)
    {
        f>>x>>y>>z;
        a[x][y][z]=-1;
    }
    bordare();
    lee();
    T=a[k2][l2][c2];
    g<<T<<"\n";
    g<<k1<<" "<<l1<<" "<<c1<<"\n";
    drum(k2,l2,c2,T);
    return 0;
}