搜尋與回溯

2022-06-20 05:09:08 字數 2107 閱讀 5388

搜尋與回溯

本詞條由「科普中國」科學百科詞條編寫與應用工作專案 審核 。

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。許多複雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。

簡言之就是先按照一條路走,走到不能再往前時,後退一步,選擇另一條道路,如果

仍是沒有路,就再退一步,直到將所有路都探索完。

例:在有n個整數的集合中選取r(r

有些同學可能想到了排列組合a(n,r)。但注意題目,要求列出所有排列。

我們只能老老實實地乙個個列舉。

看**

#includeusing

namespace

std;

int a[10000000],n,r,num=0

;bool b[1000000]={}; //

用bool型變數判斷該數是否可用

int search(int

);int

print();

intmain()

int search(intk)}

intprint()

舉個例子,5個數選3個排列,先選了1①,不夠r,又開始遞迴search,for②迴圈中,發現1用過了,又跳到2,

沒用過,還是不夠r,又遞迴,for③1,2不能用選取了3,此時夠了r,輸出,將3再初始化為0,此時for③迴圈進行到了4,輸出,初始化,又到了5,這迴圈結束之後,for②進行到了3,以此類推,直到①迴圈完了5,結束。

①②為第幾層迴圈。

乙個如下的 6 ×6 的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有乙個,每條對角線(包括兩條主對角線的所有平行線)上至多有乙個棋子。

上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 5246135 來描述,第 ii 個數字表示在第 ii 行的相應位置有乙個棋子,如下:

行號 1\ 2\ 3\ 4\ 5\ 6123456

列號 2\ 4\ 6\ 1\ 3\ 5246135

這只是棋子放置的乙個解。請編乙個程式找出所有棋子放置的解。

並把它們以上面的序列方法輸出,解按字典順序排列。

請輸出前 33 個解。最後一行是解的總個數。

一行乙個正整數 n,表示棋盤是 n ×n 大小的。

前三行為前三個解,每個解的兩個數字之間用乙個空格隔開。第四行只有乙個數字,表示解的總數。

輸入 #1複製

6
輸出 #1複製

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4

【資料範圍】

對於 100% 的資料,6<=n<=13

這就是經典的八皇后問題。首先分析題,每行只能放乙個,那麼我們可以用一維陣列

來表示位置,a[5]=3,就可以表示第五行,第三列。

對角線分為兩條,「/」與「\」,前者在同一對角線的規律為x-y值相同,後者x+y值相同。

故我們可以用bool型變數來表示這一對角線是否可用。

直接來看**

1 #include2

using

namespace

std;

3int a[15];4

int n,tot=0;5

bool b[100],c[100],d[100];6

int print(int t) //

輸出函式 715

}16int search(int t) //

t為擺放第幾個棋子

1728}29

intmain()

30

深搜優化技巧

搜尋與回溯

p1157 組合的輸出 原題見洛谷。這道題是非常典型的搜尋與回溯,主要就是把所有可能篩一遍並依次輸出。search寫法 include using namespace std int num 0,a 10001 n,r bool b 10001 void print dfs寫法 include us...

搜尋與回溯演算法

搜尋與回溯是計算機解題中常用的演算法,很多問題無法根據某種確定的計算法則來求解,可以利用搜尋與回溯的技術來求解。回溯是搜尋演算法中的一種控制策略。回溯的基本思想是 為了求得問題的解,先選擇某一種可能的情況向前探索,在探索過程中,一旦發現原來的選擇是錯誤的,就退回一步重新選擇,繼續向前探索,如此反覆進...

LETTERS 搜尋與回溯

給出乙個r oe c olroe col的大寫字母矩陣,一開始的位置為左上角,你可以向上下左右四個方向移動,並且不能移向曾經經過的字母。問最多可以經過幾個字母。第一行,輸入字母矩陣行數rr和列數ss,1 r,s 201 r,s 20。接著輸出rr行ss列字母矩陣。最多能走過的不同字母的個數。3 6 ...