Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define iota(i,n,b,s) for(int i=int(b);i!=int((b)+(s)*(n));i+=(s))
  5. #define range(i,n,m) iota(i,(((n)>(m))?((n)-(m)+1):((m)-(n)+1)),(n),((n)>(m)?-1:1))
  6. #define rep(i,n) iota(i,(n),0,1)
  7.  
  8. #define INF (1e9)
  9. #define EPS (1e-9)
  10. #define cons(a,b) (make_pair(a,b))
  11. #define car(a) (a.first)
  12. #define cdr(a) (a.second)
  13. #define cadr(a) (car(cdr(a)))
  14. #define cddr(a) (cdr(cdr(a)))
  15. #define all(a) a.begin(), a.end()
  16. #define trace(var) cerr<<">>> "<<#var<<" = "<<var<<endl;
  17.  
  18. typedef long long Integer;
  19. typedef double Real;
  20.  
  21. template<class S, class T>
  22. ostream& operator<<(ostream& os, pair<S,T> p) {
  23. os << '(' << car(p) << ", " << cdr(p) << ')';
  24. return os;
  25. }
  26.  
  27. template<class T>
  28. ostream& operator<<(ostream& os, vector<T> v) {
  29. os << v[0];
  30. for (int i=1, len=v.size(); i<len; ++i) os << ' ' << v[i];
  31. return os;
  32. }
  33.  
  34. int dx[] = { -1, 0, 1, 0 };
  35. int dy[] = { 0, -1, 0, 1 };
  36.  
  37. int dice_line1[4] = {2,3,5,4};
  38. int dice_line2[4] = {1,4,6,3};
  39. int dice_line3[4] = {1,2,6,5};
  40.  
  41. struct Dice {
  42. enum Face {
  43. U, D, L, R, F, B
  44. };
  45.  
  46. int get_right(int u, int f) {
  47. if (u > 3) {
  48. return 7 - get_right(7 - u, f);
  49. }
  50. int *line;
  51. if (u == 1) line = dice_line1;
  52. if (u == 2) line = dice_line2;
  53. if (u == 3) line = dice_line3;
  54. for (int i = 0; i < 4; ++i) {
  55. if (line[i] == f) return line[-~i % 4];
  56. }
  57. assert(false);
  58. }
  59.  
  60. int up; int down;
  61. int left; int right;
  62. int front; int back;
  63. Dice (int u, int f) : up(u), front(f) {
  64. assert(1 <= u && u <= 6);
  65. assert(1 <= f && f <= 6);
  66. assert(u != f);
  67. assert(u + f != 7);
  68. right = get_right(u, f);
  69. left = 7 - right;
  70. down = 7 - up;
  71. back = 7 - front;
  72. }
  73.  
  74. void roll(Face f) {
  75. if (f == U) return;
  76. if (f == D) return;
  77.  
  78. if (f == R) { // roll to right
  79. int tmp = up;
  80. up = left;
  81. left = down;
  82. down = right;
  83. right = tmp;
  84. } else if (f == L) {
  85. int tmp = up;
  86. up = right;
  87. right = down;
  88. down = left;
  89. left = tmp;
  90. } else if (f == F) {
  91. int tmp = up;
  92. up = back;
  93. back = down;
  94. down = front;
  95. front = tmp;
  96. } else if (f == B) {
  97. int tmp = up;
  98. up = front;
  99. front = down;
  100. down = back;
  101. back = tmp;
  102. }
  103. assert(up + down == 7);
  104. assert(left + right == 7);
  105. assert(front + back == 7);
  106. }
  107.  
  108. };
  109.  
  110. ostream& operator<<(ostream& os, Dice d) {
  111. os << "(dice "
  112. << d.up << ' '
  113. << d.front << ' '
  114. << d.right << ' '
  115. << d.down << ' '
  116. << d.back << ' '
  117. << d.left << ")" << endl;
  118. return os;
  119. }
  120.  
  121. int main() {
  122.  
  123. for (int n; cin >> n, n; ) {
  124. int cx[201][201];
  125. int ux[201][201];
  126. rep (i, 201) {
  127. rep (j, 201) {
  128. cx[i][j] = 0;
  129. ux[i][j] = 0;
  130. }
  131. }
  132.  
  133. rep (i, n) {
  134. //cerr << "# " << i << endl;
  135. int u, f; cin >> u >> f;
  136. Dice d(u, f);
  137.  
  138. int x = 100;
  139. int y = 100;
  140.  
  141. for (;;) {
  142. bool b = true;
  143. for (int k=6; k>=4; --k) {
  144. if (d.front == k && cx[x][y] > cx[x+1][y]) {
  145. d.roll(d.F);
  146. x++;
  147. goto less;
  148. }
  149. else if (d.right == k && cx[x][y] > cx[x][y+1]) {
  150. d.roll(d.R);
  151. y++;
  152. goto less;
  153. }
  154. else if (d.back == k && cx[x][y] > cx[x-1][y]) {
  155. d.roll(d.B);
  156. x--;
  157. goto less;
  158. }
  159. else if (d.left == k && cx[x][y] > cx[x][y-1]) {
  160. d.roll(d.L);
  161. y--;
  162. goto less;
  163. }
  164. }
  165. goto more;
  166. less:;
  167. //cerr << "roll to " << cons(x-100, y-100) << endl;
  168. }
  169. more:;
  170.  
  171. //cerr << "at " << cons(x-100, y-100) << endl;
  172. ux[x][y] = d.up;
  173. cx[x][y]++;
  174. }
  175.  
  176. vector<int> count(6, 0);
  177. rep (i, 201) {
  178. rep (j, 201) {
  179. if (ux[i][j] > 0) count[ux[i][j] - 1]++;
  180. }
  181. }
  182.  
  183. for (int i=0; i<5; ++i) cout << count[i] << ' ';
  184. cout << count[5] << endl;
  185.  
  186. }
  187.  
  188. return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement