package beautyOfCoding;
import java.util.Arrays;
/*
*《编程之美》的思路是:搜索+剪枝。有点像是写下棋程序:当前情况下,把所有可能的下一步都做一遍;在这每一遍操作里面,计算出如果按这一步走的话,能不能赢(得出最优结果)。
*《编程之美》上代码有很多错误,且每个变量的含义令人费解。因此我按我的理解写了以下代码:
*/
public class CPrefixSorting {
private int[] cakeArray;//要排序的烙饼数组
private int[] reversingCakeArray;//对cakeArray的一份拷贝。在“搜索+剪枝”过程中,对reversingCakeArray进行操作而不影响原始的排序数组--“cakeArray”。
//事实上我认为是不必要的,因为每次reverse(0,i)之后都会再次执行reverse(0,i)将reversingCakeArray还原。
private int[] swapRecord;//记录最优解的翻转方案。例如如果swapRecord={2,4};表示第一次把0-2之间的烙饼翻转,第二次把0-4之间的烙饼翻转
private int[] swapingRecord;//记录每一次翻转方案。只有在最优解的时候,才复制到swapRecord
private int MaxSwapTimes;//翻转次数
private int searchTimes;//搜索次数,尝试的次数
public static void main(String[] args) {
int[] cakeArray={4,5,1,3,2};
CPrefixSorting cPrefixSorting=new CPrefixSorting(cakeArray);
cPrefixSorting.search(0);
cPrefixSorting.output();
cPrefixSorting.verify();//根据swapRecord记录的最优解的翻转方案,验证一下:将烙饼翻转一次,看是否是最少的操作使烙饼有序
}
public void search(int step){
searchTimes++;
int estimate=lowerBound(reversingCakeArray);
if(step+estimate>=MaxSwapTimes){//more effective than "step+estimate>MaxSwapTimes"
return;
}
if(isSorted(reversingCakeArray)){
if(step<MaxSwapTimes){
MaxSwapTimes=step;
for(int i=0;i<MaxSwapTimes;i++){
swapRecord[i]=swapingRecord[i];
}
}
return;
}
for(int i=1,len=cakeArray.length;i<len;i++){
reverse(0,i);
swapingRecord[step]=i;
search(step+1);
reverse(0,i);
}
}
public void reverse(int begin,int end){
int len=reversingCakeArray.length;
if(begin>=0&&begin<len&&end>=0&&end<len&&begin<end){
for(int i=begin,j=end;i<j;i++,j--){
int tmp=reversingCakeArray[i];
reversingCakeArray[i]=reversingCakeArray[j];
reversingCakeArray[j]=tmp;
}
}
}
public int upperBound(int n){
return 2*(n-1);
}
public int lowerBound(int[] array){
if(array==null){
return 0;
}
if(array.length<2){
return 0;
}
int swapTimes=0;
for(int i=0,len=array.length;i<len-1;i++){
int diff=array[i]-array[i+1];
if(diff==1||diff==-1){
continue;
}else{
swapTimes++;
}
}
return swapTimes;
}
public boolean isSorted(int[] array){
if(array==null){
return false;
}
if(array.length<2){
return true;
}
for(int i=0,len=array.length;i<len-1;i++){
if(array[i]>array[i+1]){
return false;
}
}
return true;
}
public CPrefixSorting(int[] cakeArray){
this.cakeArray=cakeArray;
this.reversingCakeArray=cakeArray;
this.MaxSwapTimes=upperBound(cakeArray.length);
this.swapRecord=new int[MaxSwapTimes];
this.swapingRecord=new int[MaxSwapTimes];
this.searchTimes=0;
}
public void verify(){
System.out.println("the array to be sorted is "+Arrays.toString(reversingCakeArray));
for(int i=0;i<MaxSwapTimes;i++){
reverse(0,swapRecord[i]);
System.out.println("step "+i+":"+Arrays.toString(reversingCakeArray));
}
System.out.println("the sorted array is "+Arrays.toString(reversingCakeArray));
}
public void output(){
System.out.println("MaxSwapTimes="+MaxSwapTimes);
System.out.println("searchTimes="+searchTimes);
System.out.print("swapRecord=");
for(int i=0;i<MaxSwapTimes;i++){
System.out.print(swapRecord[i]+",");
}
System.out.println();
//System.out.println("swapRecord="+Arrays.toString(swapRecord));
}
}
分享到:
相关推荐
【华为OJ烙饼排序】是华为在线测评平台(OpenJudge)上的一道高级编程题目,主要考察的是排序算法的应用和实现。烙饼排序(Flipping Sorting),也称为煎饼排序,是一种基于比较的排序算法,它的灵感来源于煎饼翻转...
然而,翻转烙饼排序因其独特的解决思路和算法设计,仍然是学习算法设计原则和优化技巧的重要案例之一。 ### 结论 翻转烙饼排序问题不仅考验了算法设计的能力,也体现了对数据结构和排序算法原理的深刻理解。通过...
《程序之美-C语言:烙饼排序算法与买书问题源码》 在计算机科学的世界里,算法是解决问题的关键。本文将深入探讨两个编程问题:烙饼排序算法和买书问题,这两个问题都涉及到C语言的高效实现。我们将通过源代码分析...
烙饼问题的数学应用 《烙饼问题》课件.ppt是一个关于数学应用的教学资源,旨在让学生通过探索和分析烙饼问题,学习数学知识,发展逻辑思维和解决问题的能力。下面是该资源的知识点总结: 一、数学概念: 1. 最...
最新人教版四年级上册数学《烙饼问题》同步练习--.pdf
标题中的“行业文档-设计装置-一种节能燃气烙饼锅.zip”表明这是一份关于工业设计和设备创新的文档,具体聚焦在节能燃气烙饼锅的设计上。这种锅的目的是提高烹饪效率,同时减少能源消耗,是现代厨房设备技术与环保...
《烙饼问题11-2.ppt》是一个探讨优化算法的经典问题,主要涉及数学和计算机科学中的调度理论。这个问题的核心是找到在有限资源下完成任务的最有效策略,特别是当资源(在这里是平底锅)只能处理有限数量的任务时。在...
《数学广角优化烙饼问题》是一份针对中小学生设计的专业课件,主要讲解如何通过优化策略来解决实际生活中的烙饼问题,旨在培养学生的逻辑思维和优化意识。在这个问题中,核心是找到烙饼最节省时间的方法。 首先,...
文章《烙饼里的爱与温柔》通过细腻的笔触,描绘了作者肖遥童年时姥姥对烹饪的热情和对家庭成员的深厚情感。姥姥的烹饪技艺不仅仅是一种家庭生活的日常,更是她表达爱与温柔的方式。姥姥烙出的各种饼,成为了家族故事...
《数学广角合理烙饼问题》是小学四年级数学课程中的一个重要内容,主要涉及优化问题和逻辑推理。在这个问题中,我们关注的是如何在有限的条件下以最快的速度完成任务,即如何以最少的时间烙出一定数量的饼。下面将...
标签中的“烙饼问题”是一种经典的排序问题,也被称为煎饼排序。在这个问题中,想象一个平底锅可以同时煎两张饼,而我们要对多张饼进行排序,每次只能翻转一张或两张饼。烙饼问题展示了如何在有限的操作下达到目标...
最新人教版四年级数学上册《烙饼问题》教案--.pdf
烙饼问题与时间复杂度分析 在这个文件中,我们可以看到一个经典的烙饼问题,它是计算机科学中一个著名的例子,用于说明时间复杂度的概念。下面我们将详细解释这个问题的解决方案和相关的知识点。 首先,让我们了解...
最新人教版四年级数学上册《烙饼问题》课时练习--.pdf
最新人教版四年级数学上册《烙饼问题》教学设计--.pdf
最新人教版四年级数学上册《烙饼问题》教学反思--.pdf
最新人教版四年级上册数学《烙饼问题》导学案--.pdf
优化烙饼问题 通过这节课,我们可以学习到数学广角——优化烙饼问题的思想。优化烙饼问题是指在烙饼时,如何通过合理的安排来节约时间和能源。我们可以通过简单的实例,初步体会运筹思想在解决实际问题中的应用。 ...
最新人教版四年级数学上册《数学广角—烙饼问题》说课稿--.pdf
例如,在多线程编程中,如何分配和管理资源以最大化并发执行的任务数,从而提高程序的运行效率,就与烙饼问题的解决思路相类似。 此外,烙饼问题还可以帮助我们理解动态规划的思想。动态规划是一种通过将大问题分解...