Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream fin("cub1.in");
- ofstream fout("cub1.out");
- const int nmax=101;
- short a[nmax][nmax][nmax];
- int dx[]= {1,-1,0,0,0,0};
- int dy[]= {0,0,1,0,-1,0};
- int dz[]= {0,0,0,1,0,-1};
- int sol[nmax][nmax][nmax],dim;
- short ax[nmax*nmax*nmax],ay[nmax*nmax*nmax],az[nmax*nmax];
- struct T
- {
- int x,y,z;
- };
- int n,op;
- queue<T>c;
- inline void Read()
- {
- fin>>op>>n;
- for(int i=1; i<=n; i++)
- for(int j=1; j<=n; j++)
- for(int k=1; k<=n; k++)
- fin>>a[i][j][k];
- }
- inline bool Check(int i,int j,int k)
- {
- if(1<=i && i<=n && 1<=j && j<=n && 1<=k && k<=n)
- return true;
- return false;
- }
- inline void OP1()
- {
- T w,w1;
- int aux,s,mx=-1,val;
- for(int i=1; i<=n; i++)
- for(int j=1; j<=n; j++)
- for(int k=1; k<=n; k++)
- {
- s=0;
- val=a[i][j][k];
- for(int pas=0; pas<6; pas++)
- {
- w.x=i+dx[pas];
- w.y=j+dy[pas];
- w.z=k+dz[pas];
- aux=pas;
- if(Check(w.x,w.y,w.z) && ((val>>aux)&1))
- s++;
- }
- if(mx<s)
- {
- mx=s;
- w1.x=i;
- w1.y=j;
- w1.z=k;
- }
- }
- fout<<w1.x<<" "<<w1.y<<" "<<w1.z<<"\n";
- }
- inline void Init()
- {
- for(int i=1; i<=n; i++)
- for(int j=1; j<=n; j++)
- for(int k=1; k<=n; k++)
- sol[i][j][k]=100000000;
- }
- inline void OP2()
- {
- T w,w1,w2;
- w.x=w.y=w.z=1;
- c.push(w);
- sol[1][1][1]=1;
- while(!c.empty())
- {
- w.x=c.front().x;
- w.y=c.front().y;
- w.z=c.front().z;
- c.pop();
- int val=a[w.x][w.y][w.z];
- for(int k=0; k<6; k++)
- {
- w1.x=w.x+dx[k];
- w1.y=w.y+dy[k];
- w1.z=w.z+dz[k];
- int aux=k;
- if(Check(w1.x,w1.y,w1.z) && ((val>>aux)&1) && sol[w1.x][w1.y][w1.z]>sol[w.x][w.y][w.z]+1)
- {
- sol[w1.x][w1.y][w1.z]=sol[w.x][w.y][w.z]+1;
- c.push(w1);
- }
- }
- }
- if(sol[n][n][n]==100000000)
- {
- fout<<"-1\n";
- return;
- }
- fout<<sol[n][n][n]<<"\n";
- w.x=w.y=w.z=n;
- c.push(w);
- while(w.x!=1 || w.y!=1 || w.z!=1)
- {
- bool ok=false;
- for(int k=0; k<6 && !ok; k++)
- {
- w1.x=w.x+dx[k];
- w1.y=w.y+dy[k];
- w1.z=w.z+dz[k];
- int val=a[w1.x][w1.y][w1.z];
- if(Check(w1.x,w1.y,w1.z))
- {
- for(int k1=0; k1<6 && !ok; k1++)
- {
- w2.x=w1.x+dx[k1];
- w2.y=w1.y+dy[k1];
- w2.z=w1.z+dz[k1];
- int aux=k1;
- if(w2.x==w.x && w2.y==w.y && w2.z==w.z)
- {
- if( sol[w1.x][w1.y][w1.z]==(sol[w.x][w.y][w.z]-1) && ((val>>aux)&1))
- {
- ok=true;
- c.push(w1);
- }
- }
- }
- if(ok)
- {
- w.x=w1.x;
- w.y=w1.y;
- w.z=w1.z;
- }
- }
- }
- }
- while(!c.empty())
- {
- w=c.front();
- c.pop();
- ++dim;
- ax[dim]=w.x;
- ay[dim]=w.y;
- az[dim]=w.z;
- }
- for(int i=dim; i>=1; i--)
- fout<<ax[i]<<" "<<ay[i]<<" "<<az[i]<<"\n";
- }
- int main()
- {
- Read();
- Init();
- if(op==1)
- OP1();
- else OP2();
- fin.close();
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment