程式設計之美 找出翻烙餅的最少次數

2021-09-24 05:57:50 字數 1646 閱讀 9562

最近把《程式設計之美》上這個題做了下, 覺得挺簡單的啊,即使是尋找最優解,就是乙個廣度優先搜尋,用到的資料結構是 陣列+佇列+棧, 搜尋空間還需要進一步優化.

感覺**比 書上的要簡單些,就是一些小函式 組合一下,不要像書中給出的**那樣 使用類成員變數來傳遞資料,這不是一種好的實踐方法!!!

書上的**使用深度優先搜尋,遞迴實現,除了要求比較大的棧空間之外, 還需要對 得到的 多個解 進行 優劣比較,雖然比較很簡單。 如果使用廣度優先搜尋就不會有這個問題。

後面得知這是所謂的 prefix sorting, 屬於違背研究人員徹底攻克的問題, cmu 一門課第一節就講的這個問題。有點像一些數論中的問題,理解起來簡單,徹底解決很難。

#include

#include

#include

#include

using namespace std;

struct status

;// 排序好返回true,否則 false;

bool check

(const std:

:vector<

int>

& seq)

}return true;

}std:

:vector<

int>

swap

(const std:

:vector<

int>

& seq,

int pos)

return res;

}void

outputres

(const vector

& ans,

const status status,

const status init)

std:

:cout <<

"start :"

;for

(int i =

0; i < init.seq.

size()

; i++

) std:

:cout <<

"\n"

;while

(!pos.

empty()

) std:

:cout <<

"\n"

; pos.

pop();

}}void

getanswer

(const status status,

int n)

queue.

push

(status)

;while

(!queue.

empty()

)else

if(sts.depth <2*

(n-1))

}}}}

intmain()

;int n = _start.

size()

; status start;

start.parentid =-1

; start.id =0;

start.seq = _start;

start.depth =0;

start.pos =-1

;getanswer

(start, n)

;return0;

}

程式設計之美1 3 翻烙餅問題

問題 給定一組隨機數字,使其從大到小排序。要求 只能對陣列做一種操作 翻轉arr 0 至arr n 其中n為大於0小於arrlength的整數 解題思路 搜尋樹演算法 遞迴遍歷 減枝 詳解 1.將該陣列構建為一顆樹,假設該陣列為4,2,1,3 2.目標為如何找到序列為1,2,3,4 深度最小的子節點...

程式設計之美 烙餅問題

把一摞烙餅按大的在下,小的在上拍好,乙隻手一次只能抓住上面的幾張餅,把它們上下顛倒個個。反覆幾次後把餅排好。問把餅排好需要的最小的次數。問題 是看看把餅排好需要的最小次數。找最優解的問題,可以想到用窮舉法。用遞迴的方式去遍歷所有的翻轉方式。然後找到最小的值。可以先把最上面的兩張翻一下,把次數加一,看...

程式設計之美之烙餅問題

程式設計之美之一摞烙餅.cpp 定義控制台應用程式的入口點。不同的程式會得到不同的結果嗎?有個程式能得到不同的結果,但後來證明他的結果是錯的 該演算法有點在於在於找最少的交換次數,不是在於用最少的時間進行排序,此演算法的排序時間不是最少的。因為演算法的查詢時間太長了。include stdafx.h...