ulvis.paste.net

Paste Search Dynamic
Recent pastes
roll
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define rep(i, n) for (int i = 0; i < n; ++i)
  5. #define rrep(i, st, n) for (int i = st; i < n; ++i)
  6. using pii = pair<int, int>;
  7. //const int inf = 1e9 + 7;
  8. int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
  9. int dx[] = {1, -1, 0, 0, -1, 1, 1, -1};
  10. #define ceil(a, b) a / b + !!(a % b)
  11. #define chmax(a, b) a = max(a, b)
  12. #define chmin(a, b) a = min(a, b)
  13.  
  14. string random_string( size_t length )
  15. {
  16.     auto randchar = []() -> char
  17.     {
  18.         const char charset[] =
  19.         "NEWS";
  20.         const size_t max_index = (sizeof(charset) - 1);
  21.         return charset[ rand() % max_index ];
  22.     };
  23.     string str(length,0);
  24.     generate_n( str.begin(), length, randchar );
  25.     return str;
  26. }
  27.  
  28.  
  29. struct cube {
  30.     int face[7];
  31.     int lfrb[7]; //2 ~ 5
  32.     int bo = -1;
  33. };
  34. cube c_[101];
  35. int face[7];
  36. void roll(int face[], int tmp, int a, int b, int c) {
  37.     face[1] = face[a];
  38.     face[a] = face[b];
  39.     face[b] = face[c];
  40.     face[c] = tmp;
  41. }
  42. void make_cube(int top, int front) {
  43.     int c = 0;
  44.     while (c++ < 100) {
  45.         string ch = random_string(1);
  46.         int tmp = face[1];
  47.         if (ch == "N") {
  48.             roll(face, tmp, 2, 6, 5);
  49.             //面の対応がITP1だけど、randomに転がすからいい
  50.         } else if (ch == "E") {
  51.             roll(face, tmp, 4, 6, 3);
  52.         } else if (ch == "W") {
  53.             roll(face, tmp, 3, 6, 4);
  54.         } else {
  55.             roll(face, tmp, 5, 6, 2);
  56.         }
  57.         if (face[1] == top && face[3] == front) {
  58.             break;
  59.         }
  60.     }
  61. }
  62. void const_make_cube(int i, string ch) {
  63.     int tmp = c_[i].face[1];
  64.     if (ch == "N") {
  65.         roll(c_[i].face, tmp, 4, 6, 3);
  66.     } else if (ch == "E") {
  67.         roll(c_[i].face, tmp, 5, 6, 2);
  68.     } else if (ch == "W") {
  69.         roll(c_[i].face, tmp, 2, 6, 5);
  70.     } else {
  71.         roll(c_[i].face, tmp, 3, 6, 4);
  72.     }
  73. }
  74. void init(int n, cube c_[]) {
  75.     rep(i, 7) face[i] = i;
  76.     rep(i, n) rep(j, 7) c_[i].lfrb[j] = -1;
  77. }
  78. int main() {
  79.     int n;
  80.     while (cin >> n && n) {
  81.         init(n, c_);
  82.         rep(i, n) {
  83.             int top, front; cin >> top >> front;
  84.             c_[i].face[1] = top;
  85.             c_[i].face[3] = front;
  86.             make_cube(top, front);
  87.             //rrep(j, 1, 7) cout << face[j] << " "; cout << endl;
  88.             rep(j, 7) c_[i].face[j] = face[j];
  89.             //rrep(j, 1, 7) cout << c_[i].face[j] << " "; cout << endl;r
  90.             if (n == 1) {
  91.                 cout << face[1] << endl;
  92.                 break;
  93.             }
  94.             if (i == 0) continue;
  95.             c_[i].bo = 0; //if cannot roll, end
  96.         reroll:
  97.             int dir = -1, mmax = -1;
  98.             rrep(j, 2, 6) { //which dir to roll
  99.                 if (c_[i].face[j] >= 4 && c_[i].face[j] > mmax) {
  100.                     mmax = c_[i].face[j];
  101.                     dir = j;
  102.                 }
  103.             }
  104.             cout << dir << endl;
  105.             if (dir == -1) { //cannnot roll
  106.                 int ans[7] = {0};
  107.                 rep(j, i + 1) {
  108.                     ans[c_[j].face[1]]++;
  109.                 }
  110.                 //rrep(j, 1, 7) cout << ans[j] << " "; cout << endl;
  111.                 break;
  112.             } else { //can roll
  113.                 string ddir;
  114.                 if (dir == 2) ddir = "E";
  115.                 else if (dir == 3) ddir = "N";
  116.                 else if (dir == 5) ddir = "W";
  117.                 else ddir = "S";
  118.                 const_make_cube(i, ddir);
  119.                 rrep(j, 1, 7) cout << c_[i].face[j] << " "; cout << endl;
  120.                 if (c_[i].lfrb[c_[i].bo] == -1) { //roll to ground
  121.                     c_[c_[i].bo].lfrb[dir] = i;
  122.                 } else {
  123.                     c_[i].bo = c_[c_[i].bo].lfrb[dir];
  124.                     goto reroll;
  125.                 }
  126.             }
  127.         }
  128.         int ans[7] = {0};
  129.         rep(i, n) {
  130.             ans[c_[i].face[1]]++;
  131.         }
  132.         rrep(i, 1, 7) cout << ans[i] << " "; cout << endl;
  133.     }
  134. }
  135.  
  136.  
Parsed in 0.052 seconds