算法九——回溯算法
文章出處:極客時(shí)間《數(shù)據(jù)結(jié)構(gòu)和算法之美》-作者:王爭(zhēng)。該系列文章是本人的學(xué)習(xí)筆記。
理解回溯
在我們的一生中,會(huì)遇到很多重要的岔路口。在岔路口上,每個(gè)選擇都會(huì)影響我們今后的人生。有的人在每個(gè)岔路口都能做出最正確的選擇,最后生活、事業(yè)都達(dá)到了一個(gè)很高的高度;而有的人一路選錯(cuò),最后碌碌無(wú)為。如果人生可以量化,那如何才能在岔路口做出最正確的選擇,讓自己的人生“最優(yōu)”呢?
我們可以借助前面學(xué)過(guò)的貪心算法,在每次面對(duì)岔路口的時(shí)候,都做出看起來(lái)最優(yōu)的選擇,期望這一組選擇可以使得我們的人生達(dá)到“最優(yōu)”。但是,我們前面也講過(guò),貪心算法并不一定能得到最優(yōu)解。那有沒(méi)有什么辦法能得到最優(yōu)解呢?
2004 年上映了一部非常著名的電影《蝴蝶效應(yīng)》,講的就是主人公為了達(dá)到自己的目標(biāo),一直通過(guò)回溯的方法,回到童年,在關(guān)鍵的岔路口,重新做選擇。當(dāng)然,這只是科幻電影,我們的人生是無(wú)法倒退的,但是這其中蘊(yùn)含的思想其實(shí)就是回溯算法。
回溯的處理思想,有點(diǎn)類似枚舉搜索,又被稱為“暴力搜索”。我們枚舉所有的解,找到滿足期望的解。為了有規(guī)律地枚舉所有可能的解,避免遺漏和重復(fù),我們把問(wèn)題求解的過(guò)程分為多個(gè)階段。每個(gè)階段,我們都會(huì)面對(duì)一個(gè)岔路口,我們先隨意選一條路走,當(dāng)發(fā)現(xiàn)這條路走不通的時(shí)候(不符合期望的解),就回退到上一個(gè)岔路口,另選一種走法繼續(xù)走。
八皇后問(wèn)題
在一個(gè)8x8的棋盤中,八個(gè)棋子(皇后)不能在同一行,同一列,對(duì)角線上相遇。第一幅圖是滿足要求的,第二幅圖是不滿足要求的。求八皇后所有的擺放方式。
我們把這個(gè)問(wèn)題分成8個(gè)階段。依次將八個(gè)棋子放到第一行、第二行…。在放置過(guò)程中不停地檢查看當(dāng)前位置是否滿足條件。如果不滿足就換另一種方式試。
public class EightQueens {public static void main(String[] args){new EightQueens().eightQueens();}public void eightQueens(){cal8queens(0);}private int[] result = new int[8];//下標(biāo)表示第幾行,值表示皇后在第幾列private void cal8queens(int row) {if(row==8){printResult();}else{for(int j=0;j<8;j++){if(isOk(row,j)){result[row] = j;cal8queens(row+1);}}}}private boolean isOk(int row, int col) {//不在同一列int leftUp = col-1,rightUp=col+1;for(int i=row-1;i>=0;i--){if(i!=row && result[i]==col) return false;if(leftUp>=0 && result[i]==leftUp) return false;if(rightUp<8 && result[i]==rightUp) return false;leftUp++;rightUp--;}return true;}private void printResult() {for(int i=0;i<result.length;i++){System.out.println();for(int j=0;j<8;j++){if(j==result[i]){System.out.print("Q");}else{System.out.print("*");}System.out.print(" ");}}System.out.println();} }回溯法還可以適于練習(xí)的題目:0-1背包問(wèn)題、正則表達(dá)式問(wèn)題 。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: RGB/YUV/YCbCr--关于显示,
- 下一篇: Web项目,要求:保存用户名和密码在Co