演算法學習 列舉

2022-04-12 09:58:56 字數 1670 閱讀 1831

在學習列舉演算法之前,首先問有關列舉的幾個問題

1. 為什麼要進行列舉?

2. 需要對哪些物件進行列舉?

3. 如何進行列舉?

4. 列舉的結束條件是什麼?

現在針對兩個使用列舉演算法的例項對以上問題進行分析.

例項一:熄燈問題

給定乙個5×6的棋盤,上面有燈,每個燈都有各自的按鈕,每個按鈕按下去都會使其自己和周圍的上下左右四盞燈改變(原來熄滅的變亮,原來亮的變滅),如何操作按鈕使這個棋盤上所有燈都熄滅。

例項二:青蛙問題

乙個5000×5000的稻田,有很多青蛙從這個稻田上跳過,每只青蛙跳過的步長不一樣,青蛙每次總是沿著一條直線跳躍稻田(至少3個稻子),農民早上起來看到被踩踏的稻子,希望找到造成最大損害的那只青蛙經過的路徑。

第乙個問題:為神馬要列舉?

因為解決這個問題可能不止乙個方案,然而目前我並不知道哪個方案可以,僅僅知道如果按照這個方案操作造成的結果,這個結果是否符合最後的要求並不清楚。需要進一步實驗驗證。

例項一,總共有5×6個按鈕可以操作,但並不知道按下哪些按鈕會導致所有燈都熄滅。例項二,總共有5000×5000個稻子,被踩踏的稻子也很多,但是並不知道哪些稻子是被某只青蛙踩踏的,而且是最多的。

第二個問題:需要對哪些物件進行列舉?

接著上個問題所述,假定乙個假設,接著進行這個假設,通過這個假設來進行推理,推理出乙個結果,這個結果會接著推理下乙個結果,順序下去,最後可以推導出最終的結果,最終的結果是不是題目要求的結果。而這而的假設就是我們需要列舉的物件。這個假設要求可以推得最後的唯一結果,同時它必須不是很多,否則複雜度很大。

例項一,因為下一行的按鈕負責將上一行的燈熄滅,一行一行的熄滅,只要第一行的按鈕被按下去了,第一行的燈狀態就可以確定,第二行的按鈕只需要將第一行的熄滅就行,那麼第二行的按鈕狀態也是確定的,依次類推,到最後第五行時,第五行的按鈕負責熄滅了第四行的燈,但是不一定使第五行的燈熄滅。所以需要列舉的物件是第一行的按鈕狀態。

例項二,因為被踩踏的稻子數至少為3個,所以可以將這些被踩踏的任意兩個稻子作為乙隻青蛙經過的路徑。任意兩個稻子就決定了這只青蛙的步長,根據步長就可以判斷下這只青蛙的下一步的位置,依次可以推斷出最後乙個稻子的位置,就可以知道這只青蛙是不是踩踏最多的那只了。

第三個問題:如何進行列舉?

通過對第二個問題的分析,我們知道了需要對哪些物件進行列舉,接下來需要知道如何對這些物件進行列舉。具體如何列舉需要看所要列舉的物件。

例項一,需要列舉的物件是第一行的按鈕狀態,因為按下用1表示,不按用0表示,在列舉的過程中,實際是對第一行的6個按鈕進行列舉,因為這六個按鈕都是0和1,可以看作二進位制數,列舉就是二進位制不斷加一的過程。

例項二,需要列舉的物件是踩踏稻子中任意兩個稻子,實際是對n個數中任意兩個數進行遍歷,外層迴圈遍歷 i 從1到n - 1, 內層迴圈遍歷 j 從 i 到 n。

第四個問題:列舉的結束條件是什麼?

通過問題二的分析知道,在某個假設,經過一步一步的推導,看最後的結果是否符合問題給出的條件或約束,如何符合,那列舉就可以結束,說明這個列舉就是最後的答案。

例項一, 第五行的按鈕熄滅了第五行的燈,則符合將燈全部熄滅這一要求,所以列舉結束,獲得正確的按鈕。

例項二,最後乙個稻子位置在被毀稻子列表中,而且這個列舉情況下的被毀稻子數最多,則列舉結束,可以判定這條路徑就是被毀最多路徑。

生理週期 列舉 演算法學習

問題 人生來就有三個生理週期,分別為體力 感情和智力週期,它們的週期長度為23天 28天和33天。每乙個週期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力週期的高峰,人會思維敏捷,精力容易高度集中。因為三個週期的周長不同,所以通常三個週期的高峰不會落在同一天。對於每個人,我們想知道...

稱硬幣 列舉 演算法學習

問題 有12枚硬幣。其中11枚真硬幣和1枚假硬幣。假幣和真幣重量不同 但不知道假幣比真幣輕還是重。現在,用一架天平稱了這些幣三次 告訴你稱的結果,請你找出假幣並確定假幣是輕還是重 資料保證一定能找出來 輸入第一行是測試資料組數。每組資料有三行,每行表示一次稱量的結果。硬幣標號為a l。每次稱量的結果...

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...