程式設計之美之烙餅問題

2021-06-09 13:05:50 字數 1880 閱讀 8912

// 程式設計之美之一摞烙餅.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。問題思考 烙餅排序這部分,主要考量的是對遞迴函式的...