tanasaradu

Untitled

Oct 24th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. ifstream fin("cub1.in");
  4. ofstream fout("cub1.out");
  5. const int nmax=101;
  6. short a[nmax][nmax][nmax];
  7. int dx[]= {1,-1,0,0,0,0};
  8. int dy[]= {0,0,1,0,-1,0};
  9. int dz[]= {0,0,0,1,0,-1};
  10. int sol[nmax][nmax][nmax],dim;
  11. short ax[nmax*nmax*nmax],ay[nmax*nmax*nmax],az[nmax*nmax];
  12. struct T
  13. {
  14. int x,y,z;
  15. };
  16. int n,op;
  17. queue<T>c;
  18. inline void Read()
  19. {
  20. fin>>op>>n;
  21. for(int i=1; i<=n; i++)
  22. for(int j=1; j<=n; j++)
  23. for(int k=1; k<=n; k++)
  24. fin>>a[i][j][k];
  25. }
  26. inline bool Check(int i,int j,int k)
  27. {
  28. if(1<=i && i<=n && 1<=j && j<=n && 1<=k && k<=n)
  29. return true;
  30. return false;
  31. }
  32. inline void OP1()
  33. {
  34. T w,w1;
  35. int aux,s,mx=-1,val;
  36. for(int i=1; i<=n; i++)
  37. for(int j=1; j<=n; j++)
  38. for(int k=1; k<=n; k++)
  39. {
  40. s=0;
  41. val=a[i][j][k];
  42. for(int pas=0; pas<6; pas++)
  43. {
  44. w.x=i+dx[pas];
  45. w.y=j+dy[pas];
  46. w.z=k+dz[pas];
  47. aux=pas;
  48. if(Check(w.x,w.y,w.z) && ((val>>aux)&1))
  49. s++;
  50. }
  51. if(mx<s)
  52. {
  53. mx=s;
  54. w1.x=i;
  55. w1.y=j;
  56. w1.z=k;
  57. }
  58. }
  59. fout<<w1.x<<" "<<w1.y<<" "<<w1.z<<"\n";
  60. }
  61. inline void Init()
  62. {
  63. for(int i=1; i<=n; i++)
  64. for(int j=1; j<=n; j++)
  65. for(int k=1; k<=n; k++)
  66. sol[i][j][k]=100000000;
  67. }
  68. inline void OP2()
  69. {
  70. T w,w1,w2;
  71. w.x=w.y=w.z=1;
  72. c.push(w);
  73. sol[1][1][1]=1;
  74. while(!c.empty())
  75. {
  76. w.x=c.front().x;
  77. w.y=c.front().y;
  78. w.z=c.front().z;
  79. c.pop();
  80. int val=a[w.x][w.y][w.z];
  81. for(int k=0; k<6; k++)
  82. {
  83. w1.x=w.x+dx[k];
  84. w1.y=w.y+dy[k];
  85. w1.z=w.z+dz[k];
  86. int aux=k;
  87. 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)
  88. {
  89. sol[w1.x][w1.y][w1.z]=sol[w.x][w.y][w.z]+1;
  90. c.push(w1);
  91. }
  92. }
  93. }
  94. if(sol[n][n][n]==100000000)
  95. {
  96. fout<<"-1\n";
  97. return;
  98. }
  99. fout<<sol[n][n][n]<<"\n";
  100. w.x=w.y=w.z=n;
  101. c.push(w);
  102. while(w.x!=1 || w.y!=1 || w.z!=1)
  103. {
  104. bool ok=false;
  105. for(int k=0; k<6 && !ok; k++)
  106. {
  107. w1.x=w.x+dx[k];
  108. w1.y=w.y+dy[k];
  109. w1.z=w.z+dz[k];
  110. int val=a[w1.x][w1.y][w1.z];
  111. if(Check(w1.x,w1.y,w1.z))
  112. {
  113. for(int k1=0; k1<6 && !ok; k1++)
  114. {
  115. w2.x=w1.x+dx[k1];
  116. w2.y=w1.y+dy[k1];
  117. w2.z=w1.z+dz[k1];
  118. int aux=k1;
  119. if(w2.x==w.x && w2.y==w.y && w2.z==w.z)
  120. {
  121. if( sol[w1.x][w1.y][w1.z]==(sol[w.x][w.y][w.z]-1) && ((val>>aux)&1))
  122. {
  123. ok=true;
  124. c.push(w1);
  125. }
  126. }
  127. }
  128. if(ok)
  129. {
  130. w.x=w1.x;
  131. w.y=w1.y;
  132. w.z=w1.z;
  133. }
  134. }
  135. }
  136. }
  137. while(!c.empty())
  138. {
  139. w=c.front();
  140. c.pop();
  141. ++dim;
  142. ax[dim]=w.x;
  143. ay[dim]=w.y;
  144. az[dim]=w.z;
  145. }
  146. for(int i=dim; i>=1; i--)
  147. fout<<ax[i]<<" "<<ay[i]<<" "<<az[i]<<"\n";
  148. }
  149. int main()
  150. {
  151. Read();
  152. Init();
  153. if(op==1)
  154. OP1();
  155. else OP2();
  156. fin.close();
  157. fout.close();
  158. return 0;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment