演算法 回溯Back Tracking(十七)

2021-10-04 10:48:37 字數 2082 閱讀 7114

以下是學習戀上資料結構與演算法的記錄,本篇主要內容是回溯back tracking
樹、圖的深度優先搜尋(dfs)、八皇后、走迷宮都是典型的回溯應用

練習–八皇后問題(eight queens)

在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊:任意兩個皇后都不能處於同一行、同一列、同一斜線上,請問有多少種擺法?

八皇后問題的解決思路

思路一:暴力出奇蹟:從64 個格仔中選出任意8個格仔擺放皇后,檢查每一種擺法的可行性,一共c648種擺法(大概是4.4∗109種擺法)

思路二:根據題意減小暴力程度,很顯然,每一行只能放乙個皇后,所以共有88種擺法(16777216 種),檢查每一種擺法的可行性

思路三:回溯法:回溯+ 剪枝

四皇后–回溯法

在解決八皇后問題之前,可以先縮小資料規模,看看如何解決四皇后問題

四皇后–剪枝(pruning)

八皇后–回溯法模擬

八皇后實現

/*

* 陣列索引是行號、陣列元素是列號

*/int cols;

/* * 一共多少中擺法

*/int ways;

void placequeens(int n)

/** 從第row行開始擺放

*/void place(int row)

for(int col = 0;col八皇后優化

優化的思路是利用成員變數boolean值,減少判斷次數

/*** 陣列索引是行號,陣列元素是列號

*/int queens;//在優化中,該陣列只為方便輸出列印

/*** 標記著某一列是否有皇后

*/boolean cols;

/*** 標記著某一斜線上是否有皇后(左上角 -> 右下角)

*/boolean lefttop;

/*** 標記著某一斜線上是否有皇后(右上角 -> 左下角)

*/boolean righttop;

/*** 一共有多少種擺法

*/int ways;

void placequeens(int n)

/*** 從第row行開始擺放皇后

* @param row

*/void place(int row)

for(int col = 0; col八皇后優化–對角線

左上角-> 右下角的對角線索引:row –col + 7

右上角-> 左下角的對角線索引:row + col

八皇后優化–位運算

可以利用位運算進一步壓縮八皇后的空間複雜度

回溯 leetcode回溯演算法

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...

演算法 回溯演算法

回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試 1 有許多問題,當需要找出它的解集或者要求回答什麼解是滿足某些約束條件的最佳解時,往往要使用回溯法 2 回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必...

經典演算法 回溯演算法

回溯是遍歷搜尋空間所有可能組態的方法。這些組態也許代表物件的所有排列或這是構建物件集合的所有可能的方法 子集 其他情況包括列舉乙個圖的所有生成樹,兩個節點的所有路徑或是把節點分類成不同顏色的所有不同的方式。這些問題有乙個共同的難點就是我們必須每次產生乙個可能的組態。避免重複或遺漏組態的方法就是我們必...