日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法九——回溯算法

發(fā)布時(shí)間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法九——回溯算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章出處:極客時(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é)

以上是生活随笔為你收集整理的算法九——回溯算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。