// 程式設計之美之一摞烙餅.cpp : 定義控制台應用程式的入口點。
// 不同的程式會得到不同的結果嗎?有個程式能得到不同的結果,但後來證明他的結果是錯的
//該演算法有點在於在於找最少的交換次數,不是在於用最少的時間進行排序,此演算法的排序時間不是最少的。因為演算法的查詢時間太長了。
#include "stdafx.h"
#include #include #include #include using namespace std;
#define n 10//7
class cake
if(issorted(ncakereversearr,ncakenum))
void init(int size=0);
void print() const;
void process(); //顯示最優解,翻轉過程
int run(const int cake_arr, int size, bool not_turn_back_=1, bool show=1);
};void pancake::init(int size)
min_swap=0;
min_swap_init=0;
count_search=0;
count_reverse=0;
cake_size=0;
cake_old=null;
not_turn_back=true;
}void pancake::print() const
reverse_cake(sz);
*p++=sz--;
++min_swap;
while(sz>0 && sz==cake[sz]) --sz;
} cake.assign(cake_arr,cake_arr+size); //恢復原來的陣列
cake.push_back(size); //多放乙個烙餅,避免後面的邊界判斷
cake_swap[0]=0; //為方便起見,假設第0步翻轉的烙餅編號為0
for (i=0,least_swap=0; i2) least_swap++;
//等同於if (cake[i]-cake[i+1]>1 || cake[i]-cake[i+1]<-1) least_swap++;
min_swap_init=min_swap;
if (least_swap != min_swap)
search_cake(size,0,least_swap);
if (show) print();
return min_swap;
}void pancake::search_cake(int size, int step, int least_swap_old)
reverse_cake(pos);
search_cake(size,step,least_swap);
reverse_cake(pos);
}}int main()
; int aa[6]= ;//此時 改程式不對
pancake cake(16);
//? cake.run(aa,10);
//? cake.run(aa,10,0);
cake.run(aa,6);
cake.run(aa,6,0);
cake.process();
//遍歷求第n個烙餅數
const int n=8;
int i,j,max=0,tmp;
int arr[n];
for (j=1;j<=n;++j)
cout< 他的程式確實有問題
程式設計之美 烙餅問題
把一摞烙餅按大的在下,小的在上拍好,乙隻手一次只能抓住上面的幾張餅,把它們上下顛倒個個。反覆幾次後把餅排好。問把餅排好需要的最小的次數。問題 是看看把餅排好需要的最小次數。找最優解的問題,可以想到用窮舉法。用遞迴的方式去遍歷所有的翻轉方式。然後找到最小的值。可以先把最上面的兩張翻一下,把次數加一,看...
程式設計之美1 3 翻烙餅問題
問題 給定一組隨機數字,使其從大到小排序。要求 只能對陣列做一種操作 翻轉arr 0 至arr n 其中n為大於0小於arrlength的整數 解題思路 搜尋樹演算法 遞迴遍歷 減枝 詳解 1.將該陣列構建為一顆樹,假設該陣列為4,2,1,3 2.目標為如何找到序列為1,2,3,4 深度最小的子節點...
程式設計之美 1 3 烙餅排序問題
問題描述 烙餅問題可以簡化為對一段由n個無重複的整數組成的無序陣列a n 進行排序。排序要求每次只能對a 0 a i 部分的陣列進行翻轉 0 i n 最終完成排序。輸入 陣列大小n n個整數。輸出 最小遞迴查詢次數m 每次翻轉位置j0j1 jm 1。問題思考 烙餅排序這部分,主要考量的是對遞迴函式的...