PHP實現八皇后演算法 回溯演算法

2021-09-17 03:29:45 字數 2180 閱讀 5244

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

回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

這邊先以4皇后來解釋解決步驟:

在第一行有四種可能,選擇第乙個位置放上皇后

第二行原本可以有四種可能擺放,但是第一第二個已經和第一行的皇后衝突了,因此只剩下第三第四個格仔了,先選擇第三個格仔

接下來是第三行,根據規則可以看出,第三行已經沒有位置放了,因為都跟第一第二行的皇后衝突,此時返回到第二行第四個

繼續來到第三行,發現只有第二個滿足條件

然後發現第四行已經不能放了,只能繼續返回,返回到第一行,開始下一種可能

按照 1-5 的步驟,可以找到下面的其中一種解法

總而言之,回溯法就是開始一路到底,碰到南牆了就返回走另外一條路,有點像窮舉法那樣走遍所有的路。

php**實現:

<?php 

class backtracking

} $this->has_set_x = array();

$this->has_set_y = array();

$this->has_set_site = array();

} // 獲取排列

public function getpermutation($is_get_on = true)

}if($site_result == true) else

$current_n--; // 回溯到上一步,即讓乙個皇后x座標+1繼續嘗試放置

}} return $permutation_array;

} // 設定皇后位置

public function setqueensite($n, $start_x) else

} // 檢查皇后位置是否正確

public function checkqueensite($x, $y) 1;");

eval("\$diagonal_y=$diagonal_y 1;");

if($diagonal_x >= $this->n || $diagonal_y >= $this->n || $diagonal_x < 0 || $diagonal_y < 0) break;

if($this->chessboard[$diagonal_x][$diagonal_y] == 1) return false;

}} return true;

} // 刪除陣列元素

public function deletearrayvalue(&$array, $value)

}$n = 8; // 8表示獲取8皇后的排列組合

$backtracking = new backtracking($n);

$permutations = $backtracking->getpermutation(false);

var_dump($permutations); // 輸出92種排列

回溯演算法 八皇后

總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b 1b2....

回溯演算法 八皇后

今天學習了下回溯演算法,順便看了下經典案例 八皇后問題。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。回溯演算法的搜尋邏輯是深度優先,即,從一條路往前走,能進則進,不能進則...

八皇后演算法(回溯)

演算法描述 八皇后是一道很具典型性的題目。它的基本要求是這樣的 在乙個8 8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數...