本期演算法講解思路:
白話演算法->演算法思路->例項:八皇后問題->例項:01揹包問題->演算法教你玩數獨
白話演算法
回溯法(back tracking)(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
白話:回溯法可以理解為通過選擇不同的岔路口尋找目的地,乙個岔路口乙個岔路口的去嘗試找到目的地。如果走錯了路,繼續返回來找到岔路口的另一條路,直到找到目的地。
例項一:八皇后問題
八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后(棋子),使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
八皇后問題解題思路:
問題簡化:下面我們將八皇后問題轉化為四皇后問題,並用回溯法來找到它的解
目的:在4x4棋盤上,使得4個皇后不能在同行同列以及同斜線上。
step1
嘗試先放置第一枚皇后,被塗黑的地方是不能放皇后
step2
第二行的皇后只能放在第三格或第四格,比方我們放第三格,則:
此時我們也能理解為什麼叫皇后問題了,皇后旁邊容不下其他皇后。而在同乙個房間放下四個皇后確實是個不容易的問題。
step3
可以看到再難以放下第三個皇后,此時我們就要用到回溯演算法了。我們把第二個皇后更改位置,此時我們能放下第三枚皇后了。
step4
雖然是能放置第三個皇后,但是第四個皇后又無路可走了。返回上層呼叫(3號皇后),而3號也別無可去,繼續回溯上層呼叫(2號),2號已然無路可去,繼續回溯上層(1號),於是1號皇后改變位置如下,繼續回溯。
這就是回溯演算法的精髓,雖然沒有最終把問題解決,但是可以劇透一波,就是根據這個演算法,最終能夠把四位皇后放在4x4的棋盤裡。也能用同樣的方法解決了八皇后問題。下面我們用**解決八皇后問題。
**實現八皇后問題
我們將演算法也設定成兩步,
第一步 我們要判斷每次輸入的皇后是否在同一行同一列,或者同一斜線上。
bool is_ok(int row);
//查詢該行裡是否有這個值
bool isvaild(int count)
int i = count/9;
int j = count%9;
//檢測行
for(int iter = 0;iter!=j;iter++)
if(a[i][iter]==a[i][j])
return 1;
//檢測列
for(int iter=0;iter!=i;iter++)
if(a[iter][j]==a[i][j])
return 1;
//檢測九宮
for(int p =i/3*3;p
for(int q=j/3*3;q
if(p==i&&j==q)
continue;
if(a[p][q]==a[i][j])
return 1;
return 0;
void print()
cout<
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
cout<
cout<
cout<
void first_chek(int count)
if(81 ==count)
print();
return;
int i = count/9; //列
int j = count%9; //行
if(a[i][j]==0)
for(int n=1;n<=9;n++)
a[i][j] = n;
if(!isvaild(count)) //這個值不衝突
first_chek(count+1) }
a[i][j] = 0;
else
first_chek(count+1);
int main()
a[1][2] = 3;
a[5][3] = 9;
a[8][8] = 1;
a[4][4] = 4;
first_chek(0);
return 0;
其中2行3列、6行4列、9行9列、5行5列數字為已知。最後結果,
總結回溯法屬於深度優先搜尋,由於是全域性搜尋,複雜度相對高。
回溯演算法**:
小白帶你神經網路向量化
我們知道了神經網路的基本結構預期神經元節點輸入輸出的計算方法。我們可以將現在的神經網路看出乙個巨大的有向無環圖。1.python的numpy處理資料,所有的資料python總都會盡量被表示為乙個多維陣列或者矩陣。我們來看一下,這裡w表示第一層和第二層的所有連線引數。w就是第1層和第1個節點和第2層第...
零基礎小白 帶你從頭到尾的細緻了解DHCP協議
dhcp基本背景 1.1.前言 dhcp協議 2.1.dhcp的介紹 dhcp dynamic host configure protocol,動態主機配置協議 從bootp bootstrap protocol 協議發展而來 udp封裝,伺服器 67,客戶端 68 動態分配tcp ip資訊 ip位...
小白學Python(一)
小白學python 一 一 注釋 單行注釋 多行注釋 注 在python2中為了支援中文必須寫中文注釋在第一行 coding utf 8 二 定義變數 語法 變數名 變數值 例 a 10 在第一次為變數賦值為定義變數,第一次之後就為修改變數 變數的型別 1 數字 int 整型 long 長整型 fl...