日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯法在解决八皇后问题中的应用

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法在解决八皇后问题中的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

回溯法:有這樣一類題目,它們要求在相對問題的輸入規模按照指數速度增長(或者更快)的域中,找出一個具有指定特性的元素。例如:在圖頂點的所有排列中求一個哈密頓回路,在背包問題的一個實例中求其中最有價值的物品子集,等等。在原則上這類問題可以采用窮舉法求解,窮舉法通常需要我們求出所有的候選解,然后從中找出符合特征的元素。

而回溯法確實一個聰明的改變。回溯的思想是每次只構造解的一部分,如果這部分構造解可以進一步構造而不會違反約束條件,那么就接受對解的下一個分量所做的第一個合法解釋,反之,則不需要對該分量繼續選擇,將該分量替換成它的下一個選擇。

我們可以用樹的模型來簡化理解,而這棵樹也被稱為空間狀態樹。回溯法會逐層遍歷,而一旦某個節點不符合約束,則直接放棄這個節點下的所有情況。

n皇后問題是在8皇后的基礎上衍生而來的,我們以8皇后為例講解:

8皇后問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種情況。

思路:8皇后問題就是最經典的回溯法問題,對檢查[m, 1]...[m, n],從中找出滿足約束(即任意兩個皇后都不能處于同一行、同一列或同一斜線上)的情況,遞歸執行,檢查[m+1, 1]...[m+1, n]。每次注意回溯。

完整代碼:

package parcel;public class Main {static final int N = 8;static int chess[][] = new int[N][N];static int count = 0;public static void main(String[] args) {// 逐行f(0);System.out.println(count);}private static void f(int row) {if(row > N-1) {count++;print();return;}for(int i=0;i<N;i++) {//擺放每一行的皇后前,要清除這一行之前的擺放for(int j = 0; j < N; j++) {chess[row][j] = 0;}chess[row][i] = 1;if( isSafety(row, i) ) {f(row+1);}}}private static boolean isSafety(int row, int col) {//判斷中上、左上、右上是否安全int step=1;while(row - step >= 0){if(chess[row-step][col] == 1) { //上return false;}if(col-step >= 0 && chess[row-step][col-step] == 1) { //左上return false;}if(col+step < N && chess[row-step][col+step] == 1) { //右上return false;}step++;}return true;}private static void print() {// TODO Auto-generated method stubSystem.out.println("方案" + count + ":");for(int i = 0; i < N; i++) {for(int j = 0; j < N; j++) {System.out.print(chess[i][j] + " ");}System.out.println();}System.out.println();} }

C++一維數組實現

#include <iostream> using namespace std; const int N = 8; int chess[N]; int cnt = 0;bool isSafety(int row, int col) {//判斷中上、左上、右上是否安全int step = 1;while (row - step >= 0){if (chess[row - step] == col){ //上return false;}if (col - step >= 0 && chess[row - step] == (col - step)){ //左上return false;}if (col + step < N && chess[row - step] == (col + step)){ //右上return false;}step++;}return true; } void f(int row) {if (row > N - 1){cnt++;return;}for (int i = 0; i < N; i++){chess[row] = i;if (isSafety(row, i)){f(row + 1);}} } int main() {f(0);cout << cnt;return 0; }

?

8皇后問題采用這種方法雖然能解出來92,但是對于n皇后問題來說,這個程序顯然有諸多不足,當執行15皇后的時候已經需要花費將近90s才能出來結果,效率非常低下。如果是專注于算法研究的話,推薦參考下面的文章。

?

8皇后以及N皇后算法探究,回溯算法的JAVA實現,遞歸方案

位運算解決八皇后問題

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的回溯法在解决八皇后问题中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。