得到这个问题。
。这样的思想很简单,实现也很easy。可是这仅仅是提供了,问题的一个可行解,看完书中的内容之后发现。题目中要求的是最优化的输出过程,我们的这样的方法显然没有考虑到优化<-_->!!
事实上,我认为就算我看到了这个最优化输出的要求,预计也想不到书中的设计思想的了。过段时间,等自己把书中的思想忘掉之后。再看看能不能想到这样的算法思想吧。这应该算是埋了个坑吧 <-_->!!
这里将自己的代码贴出来:
// ================【翻饼问题】================= // @ author : zhyh2010 // @ date : 20150611 // @ version : 1.0 // @ description : 要求保证传入的都是真实序列中的 id。 ie 下标从 1 開始计算 // 程序内部自己主动转化成 下标为 0 開始的 去 计算 // ===============【end 翻饼问题】================= #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM 10 int arr[NUM] = { 0 }; int flip_num = 0; void init() { time_t tm; time(&tm); srand((unsigned int)tm); for (int i = 0; i != NUM; i++) arr[i] = rand() % 100; } void display() { for (int i = 0; i != NUM; i++) printf("%5d", arr[i]); printf("\n"); } int getMaxPie(int n_max) { int id_max = 0; for (int i = 0; i != n_max; i++) { if (arr[id_max] < arr[i]) id_max = i; } // 要求保证传入的都是真实序列中的 id。 ie 下标从 1 開始计算 return id_max + 1; } void swap(int & a, int & b) { a = a ^ b; b = a ^ b; a = a ^ b; } void flip(int id) { flip_num++; int low = 0; int high = id - 1; while (low < high) swap(arr[low++], arr[high--]); printf("第%d次翻转后结果:\n\t", flip_num); display(); } void FlipSort(int n) { if (n == 1) return; int id = getMaxPie(n); if (id != 1) flip(id); flip(n); FlipSort(n - 1); } void main() { init(); printf("original data are:\n\t"); display(); FlipSort(NUM); printf("共计翻转%d次\n", flip_num); }版权声明:本文博主原创文章,博客,未经同意不得转载。
转载于:https://www.cnblogs.com/bhlsheji/p/4890912.html
相关资源:数据结构—成绩单生成器