最近把《程式設計之美》上這個題做了下, 覺得挺簡單的啊,即使是尋找最優解,就是乙個廣度優先搜尋,用到的資料結構是 陣列+佇列+棧, 搜尋空間還需要進一步優化.
感覺**比 書上的要簡單些,就是一些小函式 組合一下,不要像書中給出的**那樣 使用類成員變數來傳遞資料,這不是一種好的實踐方法!!!
書上的**使用深度優先搜尋,遞迴實現,除了要求比較大的棧空間之外, 還需要對 得到的 多個解 進行 優劣比較,雖然比較很簡單。 如果使用廣度優先搜尋就不會有這個問題。
後面得知這是所謂的 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...