#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(a) (a).begin(), (a).end() #define rep(i, n) for (ll i = 0; i < (n); i++) #define req(i, a, b) for (ll i = (a); i < (b); i++) #define pb push_back #define debug(x) cerr << __LINE__ << ' ' << #x << ':' << (x) << '\n' #define debug2(x, y) cerr << __LINE__ << ' ' << #x << ':' << (x) << ',' << #y << ':' << (y) << '\n' #define debug3(x, y, z) cerr << __LINE__ << ' ' << #x << ':' << (x) << ',' << #y << ':' << (y) << ',' << #z << ':' << (z) << '\n' using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef long double ld; template using P = pair; template using pri_l = priority_queue; template using pri_s = priority_queue, greater>; constexpr int inf = 1000000010; constexpr int inf2 = 2000000010; constexpr ll INF = 1000000000000000010; constexpr ll INF4 = 4000000000000000010; constexpr int mod1e9 = 1000000007; constexpr int mod998 = 998244353; constexpr ld eps = 1e-12; constexpr ld pi = 3.141592653589793238; constexpr ll ten(int n) { return n ? 10 * ten(n - 1) : 1; }; int dx[] = { 1,0,-1,0,1,1,-1,-1,0 }; int dy[] = { 0,1,0,-1,1,-1,1,-1,0 }; ll mul(ll a, ll b) { return (b != 0 && a > INF / b ? INF : a * b); } void fail() { cout << "-1\n"; exit(0); } void no() { cout << "No\n"; exit(0); } template void er(T a) { cout << a << '\n'; exit(0); } template inline bool chmax(T& a, const U& b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(T& a, const U& b) { if (a > b) { a = b; return true; } return false; } template istream& operator >>(istream& s, vector& v) { for (auto& e : v) s >> e; return s; } template ostream& operator <<(ostream& s, const vector& v) { for (auto& e : v) s << e << ' '; return s; } template ostream& operator << (ostream& s, const pair& p) { s << p.first << ' ' << p.second; return s; } struct fastio { fastio() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(20); cerr << fixed << setprecision(20); } }fastio_; namespace rdv { random_device seed_gen; mt19937_64 engine(seed_gen()); ll rnum(ll r) { return engine() % r; } // [0, r) ll rnum(ll l, ll r) { return rnum(r - l) + l; } // [l, r) ll rng(ll l, ll r) { return rnum(l, r + 1); } // [l, r] double rng01() { return engine() * pow(2, -64); } template void shuf(vector& v) { shuffle(all(v), engine); } void shuf(string& s) { shuffle(all(s), engine); } } using namespace rdv; template vector compress(vector v) { int n = v.size(); vector tmp = v; sort(tmp.begin(), tmp.end()); tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end()); vector res(n); for (int i = 0; i < n; i++) res[i] = lower_bound(tmp.begin(), tmp.end(), v[i]) - tmp.begin(); return res; } #include using namespace atcoder; constexpr ll mod = mod998; using mint = static_modint; istream& operator >>(istream& s, mint& m) { ll y; s >> y; m = y; return s; } ostream& operator <<(ostream& s, mint& m) { return s << m.val(); } ostream& operator <<(ostream& s, const vector& v) { for (auto& e : v) s << e.val() << ' '; return s; } vector fac, inv, facinv; void modcalc(int n) { fac.resize(n); inv.resize(n); facinv.resize(n); fac[0] = 1; fac[1] = 1; inv[1] = 1; facinv[0] = 1; facinv[1] = 1; for (ll i = 2; i < n; i++) { fac[i] = fac[i - 1] * i; inv[i] = -inv[mod % i] * (mod / i); facinv[i] = facinv[i - 1] * inv[i]; } } mint comb(ll n, ll k) { if (n < 0 || k < 0 || n < k) return 0; return fac[n] * facinv[k] * facinv[n - k]; } mint perm(ll n, ll k) { if (n < 0 || k < 0 || n < k) return 0; return fac[n] * facinv[n - k]; } mint hom(ll n, ll k) { if (n < 0 || k < 0 || n == 0 && k > 0) return 0; if (n == 0 && k == 0) return 1; return fac[n + k - 1] * facinv[k] * facinv[n - 1]; } // ひとまずセットとして 1 回走る, 16:40- int main() { bool DEBUG = false; int N = 300; int TEST = 1; cin >> TEST; while (TEST--) { vector> a(4); rep(i, 4) { if (DEBUG) { while (1) { a[i].first = rng(3, 8); a[i].second = rng(3, 8); bool good = true; rep(j, i) { if (a[i].first == a[j].first) good = false; if (a[i].second == a[j].second) good = false; } if (good) break; } } else { cin >> a[i].first >> a[i].second; a[i].first += N / 2; a[i].second += N / 2; } } if (DEBUG) rep(i, 4) debug(a[i]); rep(i, 4) rep(j, i) { assert(a[i].first != a[j].first); assert(a[i].second != a[j].second); } vector v(N, vector(N)); // use : 1, ng : -1 rep(d, 4) { int x = a[3].first + dx[d], y = a[3].second + dy[d]; v[x][y] = -1; } // a[3] のまわりは封鎖して Bob の動きを止める // a[0] から a[1] を経由して a[2] に行くように // rollback dfs でいいか // 実装に少し自信なし vector> path; bool fin = false; auto dfs = [&](auto dfs, int x, int y) -> void { if (x == a[1].first && y == a[1].second) fin = true; if (fin) return; // debug2(x, y); vector> cand; rep(d, 4) { int nx = x + dx[d], ny = y + dy[d]; if (v[nx][ny] == 1) continue; if (abs(nx - a[3].first) + abs(ny - a[3].second) <= 1) continue; if ((nx != a[1].first or ny != a[1].second) && abs(nx - a[2].first) + abs(ny - a[2].second) <= 2) continue; cand.push_back({ nx, ny }); } // debug(ssize(cand)); sort(all(cand), [&](P p0, P p1) { int c0 = abs(p0.first - a[1].first) + abs(p0.second - a[1].second); int c1 = abs(p1.first - a[1].first) + abs(p1.second - a[1].second); return c0 < c1; }); for (auto& [nx, ny] : cand) { path.push_back({ nx, ny }); v[nx][ny] = 1; dfs(dfs, nx, ny); if (fin) break; path.pop_back(); v[nx][ny] = 0; } }; int cx = a[0].first, cy = a[0].second; v[cx][cy] = 1; path.push_back({ cx, cy }); dfs(dfs, cx, cy); // debug(path); path.pop_back(); for (auto& [x, y] : path) { rep(d, 4) { int nx = x + dx[d], ny = y + dy[d]; if (v[nx][ny] == 0) v[nx][ny] = -1; } } /*while (true) { int x = -1, y = -1, dist = inf; rep(d, 4) { int nx = cx + dx[d], ny = cy + dy[d]; if (v[nx][ny] == 1) continue; if (abs(nx - a[3].first) + abs(ny - a[3].second) <= 1) continue; if (nx == a[1].first && ny == a[1].second) { x = nx, y = ny; dist = 0; break; } if (abs(nx - a[2].first) + abs(ny - a[2].second) <= 2) continue; int D = abs(nx - a[1].first) + abs(ny - a[1].second); if (chmin(dist, D)) { x = nx, y = ny; } } assert(dist != inf); v[x][y] = 1; rep(d, 4) { int nx = cx + dx[d], ny = cy + dy[d]; if (nx == x && ny == y) continue; if (v[nx][ny] == 0) v[nx][ny] = -1; } if (x == a[1].first && y == a[1].second) break; cx = x, cy = y; }*/ vector> ans; rep(i, N) rep(j, N) if (v[i][j] == -1) ans.push_back({ i - N / 2, j - N / 2 }); int sz = ssize(ans); assert(sz <= 4000); cout << sz << '\n'; for (auto &[x, y] : ans) cout << x << ' ' << y << '\n'; } }