遞歸--基于回溯和遞歸的八皇后問題解法

八皇后問題是在8*8的棋盤上放置8枚皇后,使得棋盤中每個縱向、橫向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一個可行解如圖所示:

???????

??

?????

???????
?????

??
?

??????
????

???
??????

?
???

????

思路

對于八皇后的求解可采用回溯算法,從上至下依次在每一行放置皇后,進行搜索,若在某一行的任意一列放置皇后均不能滿足要求,則不再向下搜索,而進行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索至最后一行,找到可行解,輸出。

此處可用借鑒陳海濤網易博客中的思路,不用二維數組,而采用一維數組進行回溯,參見http://www.cnblogs.com/jiayouwyhit/p/3226757.html。因為1維數組的下標即可表示行或者列,再在一維數組里面賦值,即可代表列或者行。此條件即可至少滿足八皇后問題的一個條件:兩個皇后不同行或者不同列。省去后文的一個步驟判斷。

?

本人參考網上別人的回溯思路,寫的代碼如下:(注意,本代碼已經在VC6.0下通過實驗測試)

//8皇后問題
//基于遞歸的回溯算法
const int length=8;

int counter=0;

bool Check(int matrix[], int row)//檢驗是否合理
{
??? int i=0;
??? for (i=0;i<=row-1;i++)
??? {
??????? if (matrix[i]==matrix[row] || row-i==matrix[row]-matrix[i] ||i-row==matrix[row]-matrix[i])
??????????? return false;
??? }
??? return true;
}

void EightQueen(int matrix[], int row)
{
??? int i=0,j=0;
??? for (i=0;i<length;i++)
??? {
??????? matrix[row]=i;
??????? if (Check(matrix,row) && row<=length-1)//滿足要求
??????? {
??????????? if (row==length-1)
??????????? {
??????????????? ++counter;
??????????????? printf("Solution %d:\n",counter);
??????????????? for (j=0;j<length;j++)
??????????????????? printf("%4d",matrix[j]);
??????????????? printf("\n");
??????????? }
??????????? else
????????????????? EightQueen(matrix,row+1);
??????? }
??? }
}

int main(int argc, char* argv[])
{
??? int matrix[length]={0};
??? EightQueen(matrix,0);

??? printf("We have solved the problem!\n");
??? return 0;
}

?

復雜度分析:本文算法的時間復雜度為O[n^(n+1)]。比http://www.cnblogs.com/jiayouwyhit/p/3226757.html時間復雜度更高.

實際上,經過實際的實驗測試,本文的算法實際上在時間上要比前面提到的算法性能要好很多。經過仔細分析,其原因在于:本文算法中對遞歸有一個限制條件

Check(matrix,row),即:當當前點不滿足我們的約束條件時,直接就不再進行遞歸,因此函數void EightQueen(int matrix[], int row) 的時間復雜度會遠遠小于O[n^n](假如不考慮check函數自身的時間復雜度的話)。但該算法具體的時間復雜度是多少,由于有判斷語句的存在,本人覺得此處無法寫出具體的復雜度表達式(再一次說明本人數學功底還有待提高啊\(^o^)/~)。

轉載于:https://www.cnblogs.com/jiayouwyhit/p/3227314.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259551.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab emf 讀取,20140219-Emf_Demo EMF 矢量圖 可以讀取和保存EMF 的封閉類 非常實用 matlab 238萬源代碼下載- www.pudn.com...

文件名稱: 20140219-Emf_Demo下載收藏√ [5 4 3 2 1 ]開發工具: Visual C文件大小: 6312 KB上傳時間: 2014-07-10下載次數: 2詳細說明&#xff1a;EMF 矢量圖 可以讀取和保存EMF矢量圖的封閉類非常實用-EMF EMF vector can read and save the class very useful vector cl…

orcale 之 集合操作

集合操作就是將兩個或者多個 sql 查詢的結果合并成復合查詢。常見的集合操作有UNION(并運算)、UNION ALL、INTERSECT(交運算)和MINUS(差運算)。 UNION UNION 運算可以將多個查詢結果集相加,形成一個結果集, 其結果相當于集合運算的并運算. UNION 可以將第一個查詢結果的所有行與…

PDFMate PDF Converter Pro

http://www.pdfmate.com轉載于:https://www.cnblogs.com/scgw/p/4203999.html

linux 廣播

廣播是一臺主機向局域網內的所有主機發送數據。這時&#xff0c;同一網段的所有主機都能接收到數據。發送廣播包的步驟大致如下: (1)確定一個發送廣播的接口&#xff0c;如eth0 (2)確定廣播的地址&#xff0c;通過ioctl函數&#xff0c;請求碼設置為SIOCGIFBRDADDR得到廣播的地…

thinkphp5.1 php7,空白目錄 · 細數ThinkPHP5.1.7版本新特性 · 看云

>[danger] 官方已經在前不久發布了ThinkPHP5.1.7版本&#xff0c;5.1版本相較于5.0版本而言&#xff0c;本身更加嚴謹和規范&#xff0c;更接近主流設計思想。近半年來&#xff0c;5.1版本更新頻繁&#xff0c;此次最新版本更是帶來了很多的新特性。正在或者打算使用5.1版本…

JS中popup.js

為什么80%的碼農都做不了架構師&#xff1f;>>> //popup class 顯示彈出窗口&#xff0c;。/*以下為使用popup對象&#xff0c;傳入相應的配置參數&#xff0c;彈出不同類型的窗口 function ShowIframe() //顯示iframe { var popnew P…

圖像連通域標記算法研究

搬以前寫的博客【2014-03-01 08:09】 圖像連通域標記算法研究 ConnectedComponent Labeling 最近在研究一篇復雜下背景文字檢測的論文。 “Detecting Text in Natural Scenes with Stroke Width Transform ” CPVR 2010的文章&#xff0c;它主要探討利用文字內…

lightoj 1214

lightoj 1214 Large Division &#xff08;大數除法&#xff09; 鏈接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1214 題意&#xff1a;給定 a&#xff0c; b 兩個數&#xff0c;判斷 a 是否整除 b 。&#xff08;a 為 大數&#xff09; 思路&#…

二階振蕩衰減 matlab,基于Matlab/Simulink的二階控制系統仿真研究

1 二階控制系統模型本文引用地址&#xff1a;http://www.eepw.com.cn/article/201612/328597.htm能夠用二階微分方程描述的系統稱為二階控制系統。在控制工程實踐中&#xff0c;二階控制系統十分常見&#xff0c;例如&#xff0c;電樞控制的直流電動機&#xff0c;RLC網絡和彈簧…

CCF201409-5 拼圖(30分)

試題編號&#xff1a; 201409-5 試題名稱&#xff1a; 拼圖 時間限制&#xff1a; 3.0s 內存限制&#xff1a; 256.0MB 問題描述&#xff1a; 問題描述給出一個nm的方格圖&#xff0c;現在要用如下L型的積木拼到這個圖中&#xff0c;使得方格圖正好被拼滿&#xff0c;請問總共有…

歐幾里得算法(即輾轉相除法)的時間復雜度

本文是參考新浪博客而寫。 歐幾里得算法, 又稱輾轉相除法, 用于求兩個自然數的最大公約數. 算法的思想很簡單, 基于下面的數論等式 gcd(a, b) gcd(b, a mod b) 其中gcd(a, b)表示a和b的最大公約數, mod是模運算, 即求a除以b的余數. 代碼如下: #include <iostream> #i…

UIImageJPEGRepresentation和UIImagePNGRepresentation

在Iphone上有兩種讀取圖片數據的簡單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函數需要兩個參數:圖片的引用和壓縮系數.而UIImagePNGRepresentation只需要圖片引用作為參數.通過在實際使用過程中,比較發現: UIImagePNGRepresenta…

C++ 0x

轉載于:https://www.cnblogs.com/iiiDragon/p/3230006.html

系列文章----.Net程序員學用Oracle系列

.Net程序員學用Oracle系列(18)&#xff1a;PLSQL Developer 攻略.Net程序員學用Oracle系列(17)&#xff1a;數據庫管理工具(SQL Plus).Net程序員學用Oracle系列(16)&#xff1a;訪問數據庫(ODP.NET).Net程序員學用Oracle系列(15)&#xff1a;DUAL、ROWID、NULL.Net程序員學用Or…

Github for Windows使用介紹

Git已經變得非常流行&#xff0c;連Codeplex現在也已經主推Git。Github上更是充斥著各種高質量的開源項目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。對于習慣Windows圖形界面的程序員來講&#xff0c;Github的使用是需要點時間和耐心的&#xff0c;然而最近Githu…

matlab中udt函數,《MATLAB信號處理超級學習手冊》——2.5 離散時間信號中的運算...

本節書摘來自異步社區《MATLAB信號處理超級學習手冊》一書中的第2章&#xff0c;第2.5節&#xff0c;作者&#xff1a;MATLAB技術聯盟 , 史潔玉著&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看2.5 離散時間信號中的運算MATLAB信號處理超級學習手冊2.5.1 離散…

iOS 將16進制顏色轉換成UIColor

很多地方我們都使用16進制顏色&#xff0c;但iPhone使用的是UIColor對象&#xff0c;不直接支持16進制顏色&#xff0c;為此&#xff0c;需要我們手動將16進制顏色轉換為UIColor - (UIColor *) hexStringToColor: (NSString *) stringToConvert {NSString *cString [[stringTo…

OBJ 文件格式

OBJ文件是一種標準的3D模型文件格式&#xff0c;很適合用于3D軟件模型之間的互導。比如在3dsMax或LightWave中建了一個模型&#xff0c;想把它調到Maya里面渲染或動畫&#xff0c;導出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫&#xff0c;不過…

構建Docker鏡像(三)

作者:李曉輝聯系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、準備文件新建一個目錄和一個 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile這個步驟是在設計鏡像&#xff0c;如果你需要在鏡像內包含什么軟件&#xff0c;將來開放哪些端口&…

centos 配置php開發環境變量配置,CentOS中配置PHP和Nginx環境變量

搜索熱詞一、摘要在Linux CentOS系統上 安裝完PHP和Nginx后&#xff0c;一般需要執行查看版本命令’PHP -v’和’Nginx -v’,確認是否安裝成功,如果在沒有添加到環境變量之前&#xff0c;執行“PHP -v”命令查看當前PHP版本信息時&#xff0c;則會提示命令不存在的錯誤&#xf…