import java.io.IOException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.Scanner;
class Main
{
public static final boolean DEBUG = false;
public static void change(int[] a, int n)
{
for (int i = 0; i < (n + 1)/ 2; i++) {
int tmp = a[i];
a[i] = a[n - i];
a[n - i] = tmp;
}
}
public static void main(String[] args) throws IOException
{
Scanner cin;
int n;
int[] a;
if (DEBUG) {
cin = new Scanner(new FileReader("d:\\OJ\\uva_in.txt"));
} else {
cin = new Scanner(new InputStreamReader(System.in));
}
while (cin.hasNext()) {
n = cin.nextInt();
a = new int[n];
for (int i = 0; i < n; i++) a[i] = cin.nextInt();
int[] ans = new int[2 * n];
int cnt = 0;
for (int i = n - 1; i >= 0; i--) {
if (a[i] == i + 1) continue;
for (int j = 1; j < i; j++) {
if (a[j] == i + 1) {
change(a, j);
ans[cnt++] = j + 1;
}
}
change(a, i);
ans[cnt++] = i + 1;
}
System.out.print(cnt);
for (int i = 0; i < cnt; i++) {
System.out.print(" " + ans[i]);
}
System.out.println();
}
}
}
如果要求的是求最短变换,就用递归方法求
import java.io.IOException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Arrays;
class Main
{
public static final boolean DEBUG = false;
public static int[] data;
public static int[] reverse, opArr, ans;
public static int cnt, opcnt;
public static int maxOpCnt;
public static int upbound(int n)
{
return 2 * n;
}
public static int lowbound(int[] a, int n)
{
int ret = 0;
for (int i = 1; i < n; i++) {
int t = a[i] - a[i - 1];
if (t == 1 || t == -1) {
} else ret++;
}
return ret;
}
public static boolean isSorted(int[] a, int n)
{
for (int i = 1; i < n; i++) {
if (a[i - 1] > a[i]) return false;
}
return true;
}
public static void Revert(int b, int e)
{
for (int i = b, j = e; i < j; i++, j--) {
int tmp = reverse[i];
reverse[i] = reverse[j];
reverse[j] = tmp;
}
}
public static void search(int step)
{
int iEstimate = lowbound(reverse, cnt);
if (step + iEstimate >= maxOpCnt) return;
if (isSorted(reverse, cnt)) {
if (step < maxOpCnt) {
maxOpCnt = step;
ans = Arrays.copyOf(opArr, maxOpCnt);
}
return;
}
for (int i = 1; i < cnt; i++) {
Revert(0, i);
opArr[step] = i + 1;
search(step + 1);
Revert(0, i);
}
}
public static void main(String[] args) throws IOException
{
Scanner cin;
if (DEBUG) {
cin = new Scanner(new FileReader("d:\\OJ\\uva_in.txt"));
} else {
cin = new Scanner(new InputStreamReader(System.in));
}
while (cin.hasNext()) {
cnt = cin.nextInt();
if (cnt == 0) break;
data = new int[cnt];
reverse = new int[cnt];
for (int i = 0; i < cnt; i++) data[i] = cin.nextInt();
reverse = Arrays.copyOf(data, cnt);
maxOpCnt = upbound(cnt);
opArr = new int[maxOpCnt];
ans = new int[maxOpCnt];
search(0);
System.out.print(maxOpCnt);
for (int i = 0; i < maxOpCnt; i++) {
System.out.print(" " + ans[i]);
}
System.out.println();
}
}
}