引用這首詩為了引出乙個演算法,叫做回溯法.
什麼是回溯,通俗的解釋就是當你發現自己當初的選擇是錯誤的時候,用時光機把你送回到做選擇的那一天,讓你重來一次.想一想如果高考時給你這樣的福利,豈不是美滋滋?
一下關於八皇后的解法,就是利用了回溯法.
首先做乙個最簡單的說明,因為八個皇后互相之間都攻擊不到,即不能在同一行,同一列,同一對角線.所以我們每一次只需要確定第一行的皇后的位置就可以.
先在第一行的第一列放置乙個皇后,此時它一定是合理的位置.但檢測的
步驟不能省.
具體的檢測邏輯是,把我們剛剛放置皇后的這一行之前的皇后全部拿過來攻擊它,如果攻擊不到,就是合法的,我們就繼續放下一行.否則,我們就換一列放置,並重新檢測.
如果一路檢測下來都是合格的,那麼第八個皇后放完,我們就得到了第乙個解.然後變動上一步的位置繼續檢測,知道所有的解去不求出.
# define _crt_secure_no_warnings
# include
# include
# include
int 每行中皇后所處的列數[8] = ,合法的擺放方式; //皇后在每行中所處的列數
void print_map()
printf("■");
for (列數 = 每行中皇后所處的列數[行數] +1; 列數 < 8; 列數++)
}}//檢測當前位置是否合法
int check_positon_valid(int 待檢測位置行數, int 待檢測位置的列數)
}return1;}
void put_queen(int 即將放置的行數)
put_queen(即將放置的行數 + 1);
每行中皇后所處的列數[即將放置的行數] = 0;}}
c解決八皇后問題
問題描述 這是乙個經典的關於組合學的問題 在乙個西洋棋中的的棋盤上放置8個皇后,為了使其中的任何2個皇后都不能相互 攻擊 希望尋求8個皇后的安全放置位置。該問題的不能相互 攻擊 相當於要求任意兩個皇后不能在同一行 同一列或同一斜線上。求解可能的方案及方案數。思路 一般採用回溯法。易知,每行肯定有乙個...
C 解決八皇后問題
直接上 可以自己慢慢研究 include include using namespace std int linenum 9 第i列的皇后要放的行位置 只用其中的列號1到8 bool a 9 a i 為1表示第i行上尚未放皇后 bool b 15 b i 為1表示第i條斜對角線上尚未放皇后 斜對角線...
C語言解決八皇后問題
八皇后問題是這樣乙個問題 將八個皇后擺在一張8 8的西洋棋棋盤上,使每個皇后都無法吃掉別的皇后,即 每一行,每一列,每一條對角線只有乙個皇后,一共有多少種擺法?演算法思想 首先逐行遍歷,設定queen max 陣列記錄縱座標 max為格仔數8 每次落子前判斷座標 i,queen i 是否滿足條件,用...