不使用遞迴,一次性解決八皇后問題

2021-09-12 04:16:48 字數 1040 閱讀 3634

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。

思路:一般來說,八皇后問題使用遞迴或者遞推的方法,一:在棋盤某位置放乙個皇后;二:判斷皇后是否與前面已有皇后形成相互攻擊;三:如果沒有相互攻擊,則呼叫遞迴函式,繼續放置下一列皇后;四:放置完8個不形成攻擊的皇后,變得到乙個解。

如果我們設定乙個陣列arr[8],每個元素的值代表棋牌中該行所放置皇后的位置,例如arr[1]=2,說明第二行(下標從0開始)放置位置為第三列(下標同樣從0開始)。自然可以列舉出所有排列順序,進行判斷,但是如何列舉所有順序呢?這裡用到了c++中next_permutation函式。我們用string s=「01234567」代表第一次的位置進行判斷,如果不合適,使用next_permutation排序成01234576進行迴圈,依次類推,知道所有可能排序列舉完為止。

#include "stdafx.h"

#include #include #include using namespace std;

int ans = 0;

int _tmain(int argc, _tchar* ar**)

}if (flag == 0) //如果是不合適跳出來的,說明這個順序不合適,跳出進行next_permutation

break;

if (i == 7 && flag == 1) //如果flag=1而且i=7,說明進行到最後一行並且本次順序合適,結果加1

}} while (next_permutation(s.begin(), s.end())); //獲得下乙個順序

cout << ans << endl;

return 0;

}

集中問題,一次性出擊

在工作中,總會遇到很多的問題,有些時候有些人會找你處理很多的問題,很多的問題甚至與是由於別人導致的,但是卻需要你來處理,這導致你的工作量非常大.於是你會抱怨,你不想為該使用者處理問題,但是當你將問題提交到領導那裡的時候,領導諮詢到底是什麼問題,領導會忽略掉你的情緒,看事實,你忽然發現你只是記得別人有...

一次性解決SecureCRT或Xshell超時問題

一 securecrt securecrt有乙個選項可以設定每隔多少秒自動發 送乙個資訊到伺服器端,告訴伺服器端客戶端還在連線中。會話選項 終端 反空閒 傳送字串 可以設定,比如傳送 n null或其他資訊過去,後面可以設定每隔多少秒傳送,比如可以60秒一次,這樣可以保證不會掉線。如果想應用於所有會...

一次性解決你所有的編碼檢測問題

在日常使用中,我們難以避免會遇到編碼轉換問題。如果編碼是什麼都不知道,請先看 什麼是編碼?而進行編碼轉換的前提是你知道這個字串使用的是什麼編碼。比如你使用 urllib.request.urlopen 獲取乙個網頁時,你特麼如果不知道網頁的編碼會怎樣?直接 read decode 就可能會出現下邊錯...