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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

回溯算法(Backtracking Algorithm)之八皇后问题

發(fā)布時間:2024/7/5 编程问答 83 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯算法(Backtracking Algorithm)之八皇后问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 回溯算法思想
    • 2. 算法應用
      • 2.1 八皇后問題

1. 回溯算法思想

前面講過貪心算法并不能保證得到最優(yōu)解,那怎么得到最優(yōu)解呢?

  • 回溯思想,有點類似枚舉搜索。枚舉所有的解,找到滿足期望的解。
  • 為了有規(guī)律地枚舉所有可能的解,避免遺漏和重復,把問題求解的過程分為多個階段。
  • 每個階段,我們都會面對一個岔路口,我們先隨意選一條路走,當發(fā)現(xiàn)這條路走不通的時候(不符合期望的解),就回退到上一個岔路口,另選一種走法繼續(xù)走。

2. 算法應用

2.1 八皇后問題

有一個8×8的棋盤,希望往里放8個棋子(皇后),每個棋子所在的行、列、對角線都不能有另一個棋子。請找到所有滿足這種要求的放棋子方式。

  • 把這個問題劃分成8個階段,依次將8個棋子放到第一行、第二行、第三行。。。第八行
  • 放置的過程中,不停地檢查當前的方法,是否滿足要求
  • 如果滿足,則跳到下一行繼續(xù)放置棋子
  • 如果不滿足,那就再換一種方法,繼續(xù)嘗試
  • 如果一整行都不能放下一顆,那么這種方法無效,退到上一行,上一行列位置+1,再往下嘗試


從(0,0)位置開始放置

下標5的行,走到最后也沒有放下這顆棋子,都不滿足,那么退到下標4的行,列位置+1,從4列開始新的嘗試


下標5的行容不下一顆棋子,再次回退,下標4行退到最后了,再往上退,下標3行棋子往右挪


下標7行放不下,退到6行

6行也容不下棋子,接著看5行

5行也不可以容下棋子,看第4行。。。(第一種可行解怎么還沒出來,好累,就到這里吧,大家自行 ppt 畫個圖配合代碼推一下就理解了)

第一個解是這樣的,哈哈,挪了好長時間終于出來了

/*** @description: 回溯算法--八皇后問題* @author: michael ming* @date: 2019/7/7 0:10* @modified by: */ #include <iostream> using namespace std; class EightQueen {int result[8];//下標表示行,值表示queen在哪一列void printQueens(int *result){int i,r,c,flag = 1;cout << " ";for(i = 0; i < 8; ++i)cout << "▁";cout << endl;for(r = 0; r < 8; ++r){cout << "┃";for(c = 0; c < 8; ++c){if(result[r] == c)cout << "★";else{if(flag < 0)cout << " ";elsecout << "■";}flag = -1*flag;}cout << "▏" << endl;flag = -1*flag;}cout << " ";for(i = 0; i < 8; ++i)cout << "▔";cout << endl;}bool isOk(int r, int c)//判斷在r行c列放置是否可以滿足要求{int leftup = c - 1, rightup = c + 1;for(int i = r - 1; i >= 0; --i)//逐行向上考察每一行{if(result[i] == c)//第i行的c列有棋子嗎return false;if(leftup >= 0)//考察左上對角線{if(result[i] == leftup)//第i行l(wèi)eftup列有棋子嗎return false;}if(rightup < 8)//考察右上對角線{if(result[i] == rightup)//第i行rightup列有棋子嗎return false;}--leftup; ++rightup;}return true;} public:int kinds; //可行布局種類EightQueen():kinds(0){}void cal8queens(int row) //調(diào)用方式cal8queens(0){if(row == 8) //8個棋子都放置好了,打印結(jié)果{kinds++;cout << "第" << kinds << "種放法:" << endl;printQueens(result);return;//都放置好了,沒法再遞歸了}for(int column = 0; column < 8; ++column)//每行有8種放法{if(isOk(row,column)) //該放法滿足要求{result[row] = column;//第row行的棋子放到了column列cal8queens(row+1); //考察下一行}}}}; int main() {EightQueen eq;eq.cal8queens(0);cout << "共有" << eq.kinds << "種擺放方法。" << endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的回溯算法(Backtracking Algorithm)之八皇后问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。