#include using namespace std; using ll = long long; // N^M が小さい場合専用の完全愚直 // 到達不能なら -1 int brute(int N, const vector& S, const vector& G) { int M = S.size(); // state = sum (pos[i]-1) * N^i auto encode = [&](const vector& a) { int id = 0; int p = 1; for (int i = 0; i < M; i++) { id += (a[i] - 1) * p; p *= N; } return id; }; auto decode = [&](int id) { vector a(M); for (int i = 0; i < M; i++) { a[i] = id % N + 1; id /= N; } return a; }; int states = 1; for (int i = 0; i < M; i++) states *= N; int s = encode(S); int g = encode(G); vector dist(states, -1); queue q; dist[s] = 0; q.push(s); while (!q.empty()) { int id = q.front(); q.pop(); if (id == g) return dist[id]; vector x = decode(id); // F 階の呼び出しボタンを押す for (int F = 1; F <= N; F++) { int mn = INT_MAX; for (int i = 0; i < M; i++) { mn = min(mn, abs(x[i] - F)); } // 最短距離で並んでいる elevator はどれでも選べる for (int i = 0; i < M; i++) { if (abs(x[i] - F) != mn) continue; // 既に F にいるなら押しても状態は変わらない if (x[i] == F) continue; vector y = x; y[i] = F; int nid = encode(y); if (dist[nid] == -1) { dist[nid] = dist[id] + 1; q.push(nid); } } } } return -1; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; while (Q--) { int N, M; cin >> N >> M; vector S(M), G(M); for (auto& x : S) cin >> x; for (auto& x : G) cin >> x; cout << brute(N, S, G) << '\n'; } }