意思就是给你一个身高数组,两两可以调换,问如何调换变成目标身高数组?要输出在这个过程中的调换过程。
首先,无解的情况很好判断,只需要看已有身高数组和目标身高数组的元素个数是否相同(可以排序后一个个元素比较,也可以直接每位计数)。
有解的情况呢?从暴力角度出发,如果当前已有身高数组的当前元素与目标身高数组的当前元素不匹配,那就调换当前元素和已有身高数组的后面元素,直到满足目标身高数组要求即可。
其实这问题,暴力就出来了,只要一直保证当前遍历的元素被调换为正确元素即可,自己一直在想奇特的方法,属于是脑子抽了。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
while (t-- > 0) {
int n = scan.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scan.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = scan.nextInt();
}
int[] aa = Arrays.copyOf(a, n);
int[] bb = Arrays.copyOf(b, n);
Arrays.sort(aa);
Arrays.sort(bb);
boolean flag = false;
for (int i = 0; i < n; i++) {
if (aa[i] != bb[i]) {
flag = true;
break;
}
}
if (flag) {
System.out.println("NO");
} else {
System.out.println("YES");
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
for (int j = i + 1; j < n; j++) {
if (a[j] != b[i]) continue;
// 找到要调换的位置,只要保证当前位置被换成正确的位置即可
for (int k = j; k > i; k--) { // 交换到 i 就不能再交换了
// 依次交换相邻位置
System.out.println((k + 1) + " " + k);
int tmp = a[k];
a[k] = a[k - 1];
a[k - 1] = tmp;
}
// 交换完当前位置就退出
break;
}
}
}
System.out.println(0 + " " + 0);
}
}
}
}