题目1146:Flipping Pancake

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();
		}
		
	}
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值