深搜演算法筆記

2022-08-03 03:36:10 字數 1727 閱讀 1545

沒錯高產的我又來了

1.初始狀態,從頂點1開始

2.依次訪問過頂點1,2,3後,終止於頂點3

3.從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5

4.從頂點5回溯到頂點2,並且終止於頂點2

5.從頂點2回溯到頂點1,並終止於頂點1

6.從頂點4開始訪問,並終止於頂點4

所謂深搜(也叫回溯法)就是採用的是「一直往下走,走不通了就掉頭,換一條路再往下走」

總結來說就是遞迴的列舉

深度優先搜尋的實質就是窮舉,按照一定的順序和規則不斷地去嘗試,直到找到問題的解。

對於乙個問題的第乙個狀態叫做初始狀態,最後要求的狀態叫做目的狀態。

在搜尋的過程中,對當前狀態進行檢測,如果當前狀態滿足目的狀態,那麼這個當前狀態就是結果之一。

為什麼要取消標記:

深搜搜到底以後,結束dfs(),該點不會繼續被他的父親節點再次搜到,即便已經取消標記,因為有乙個for迴圈,下一次會再次訪問與它處於同一級的其他節點

void(或者int) dfs(int c)

for ()

回溯;} return;

}

題目描述

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

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

行號 1 2 3 4 5 6

列號 2 4 6 1 3 5

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

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

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

輸入格式

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

輸出格式

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

輸入輸出樣例

輸入輸出

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

先上**:

#includeusing namespace std;

int n,a[1005],sum,b[1005],c[1005],d[1005];

void coutt()

{ sum++;

int i;

if(sum<=3)

{ for(i=1;i<=n;i++)

cout<>n;

dfs(1);

cout思路:

用a,b,c,d四個陣列分別記錄行、列和兩個對角線的占用情況

i是已放棋子的數量,從1開始遞迴。

難點在對角線的標記上:

假設我在(2,2)放了乙個皇后(紅色),那麼如何標記這整個對角線?

看,穿過(2,2)的對角線(平行)一共有兩條:

淡藍:2+2=4

深藍:2-2=0

結合對角線看看,發現什麼了嗎?

蜘蛛牌符號三角形

prime ring problem

(洛谷上也有億堆)

廣搜與深搜演算法

bfs 廣度優先搜尋 從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點 第一層點 然後再以他們為 起點 再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是...

DFS 深搜 演算法解析

圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點 v 表示,而物件之間的關係或者關聯則通過圖的邊 e 來表示。圖可以分為有向圖和無向圖,一般用g v,e 來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。在圖的基本演算法中,最初需要接觸的就是圖的遍歷演算法,根據訪問節點...

演算法之路 深搜 廣搜(簡單搜尋)

通過一定的順序,列舉每乙個資料 經常會通過一些判斷條件去掉無意義的資料,即剪枝 找到想要的資料的過程。迷宮 以迷宮為例 如圖,左上角是起點,右下角是終點。如果給我們做,我們可以一眼看出答案,但是電腦卻很難 看 出來,因為電腦一次只能看乙個格。所以就需要乙個乙個格仔去看是否能走,一直找到中間點。如果我...