#include <iostream> #include <iomanip> #include <map> #include <string> #include <algorithm> using namespace std; namespace { enum class Wall { none, x, y, }; Wall wall(int n, int x, int y) { int s = 1 << n; if (x == 0 || x == 2*s) return Wall::x; if (y == 0 || y == 2*s) return Wall::y; Wall wx = Wall::x; Wall wy = Wall::y; while (n > 0) { if ((x == 1 || x == 2*s-1) && y == s) return wx; if (x == s && y == s+1) return wy; if (x == s || y == s) return Wall::none; if (y > s) { if (x > s) x -= s; y -= s; } else { if (x > s) x = 2 * s - x; swap(wx, wy); swap(x, y); } --n; s /= 2; } return Wall::none; } } int main() { iostream::sync_with_stdio(false); cin.tie(nullptr); int n, z; cin >> n >> z; long long s = 1 << n; int x = 1; int y = 0; int vx = 1; int vy = 1; long long t; --z; cin >> t; for (long long d = 0; d <= 4*s*s; ++d) { while (d == t) { cout << x << ' ' << y << endl; if (z <= 0) return 0; cin >> t; --z; } x += vx; y += vy; auto w = wall(n, x, y); if (w == Wall::x) vx *= -1; else if (w == Wall::y) vy *= -1; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #include <iomanip> #include <map> #include <string> #include <algorithm> using namespace std; namespace { enum class Wall { none, x, y, }; Wall wall(int n, int x, int y) { int s = 1 << n; if (x == 0 || x == 2*s) return Wall::x; if (y == 0 || y == 2*s) return Wall::y; Wall wx = Wall::x; Wall wy = Wall::y; while (n > 0) { if ((x == 1 || x == 2*s-1) && y == s) return wx; if (x == s && y == s+1) return wy; if (x == s || y == s) return Wall::none; if (y > s) { if (x > s) x -= s; y -= s; } else { if (x > s) x = 2 * s - x; swap(wx, wy); swap(x, y); } --n; s /= 2; } return Wall::none; } } int main() { iostream::sync_with_stdio(false); cin.tie(nullptr); int n, z; cin >> n >> z; long long s = 1 << n; int x = 1; int y = 0; int vx = 1; int vy = 1; long long t; --z; cin >> t; for (long long d = 0; d <= 4*s*s; ++d) { while (d == t) { cout << x << ' ' << y << endl; if (z <= 0) return 0; cin >> t; --z; } x += vx; y += vy; auto w = wall(n, x, y); if (w == Wall::x) vx *= -1; else if (w == Wall::y) vy *= -1; } return 0; } |