voidexchangeByColumn(int c1, int c2) { //对两列进行互换 for (int i = 1; i <= m; ++i) swap(tmp[i][c1], tmp[i][c2]); if (c1 != c2) ++cnt; }
boolsame(int c1, int c2) { //判断两列是否相同 for (int i = 1; i <= m; ++i) if (des[i][c1] != tmp[i][c2]) returnfalse; returntrue; }
intmain() { int T; cin >> T; while (T--) { cin >> m >> n; for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) cin >> src[i][j]; for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) cin >> des[i][j];
int best = m + n + 1;
//整体思路,将每一列运用列交换作为第1列,然后对每一行进行判断,如果元素//与目标元素不相等,
//进行翻转处理,再向后判断相关列是否相同。 for (int col = 1; col <= n; ++col) { //在tmp中依次寻找des的每一列 copy(tmp, src); //先复制数组 cnt = 0; exchangeByColumn(1, col); //将第k列与第1列互换 //对所有行的第1个元素与目标数组对应的元素进行比较,如果不同 //进行按行变换 for (int i = 1; i <= m; ++i) if (tmp[i][1] != des[i][1]) flipByRow(i); //检查每一列是否满足条件 bool found; for (int c1 = 1; c1 <= n; ++c1) { //判断是否可以通过后续列的交换达到目的 found = false; for (int c2 = c1; c2 <= n; ++c2) if (same(c1, c2)) { exchangeByColumn(c1, c2); found = true; break; } if (!found) break; } if (found && best > cnt) best = cnt; }
if (best < m + n + 1) cout << best << "\n"; else cout << "-1\n"; } return0; }