C 實現遞迴 搜尋之 全排列 八皇后問題

2021-08-29 02:01:51 字數 1648 閱讀 8923

題目

**如下: 也是搜尋的經典模型

#include

int n,flag[10]

,a[10];

void

dfs(

int s)

//s:此時所在的位置

這個題的做法很有意思

這個做法抽象出來 並不是建立乙個8*8 的棋盤

而是通過record記錄全部的解 (共92個解嘛 )

line1 [i + j] 表示的是45度方法 很好理解 45度方向上 i+j是乙個定值

line2[i - j + 9] 表示的是135度方法 在135度方向上 i-j-9是乙個定值()

如果在主對角線上 i=j

我最開始是思路是遍歷 這樣顯得很繁瑣 考慮這個點以外再兩個for遍歷所有 的點

在去判斷條件 !不在同一行 同一列,點與點之間斜率的絕對值不相等

i!=flaga[sum]&&j!=flagb[sum]&&abs(i/j)!=abs(flaga[sum]/flagb[sum])

而bool 這種方法 通過i+1 之間換到下一列 然後判斷range記錄的j值是否為true (判斷行)

判斷是不是在 45度方向上 是不是在135度方法上 滿足條件記錄這個j值(行號)

當列數大於8的時候 記錄所有滿足的j值(行號) 然後 方案數++

由於後面的條件都無法成立了

自動返回到上一層 列數為7的時候 找尋還有沒有 j為其他值的情況

然後如果有 繼續 滿足條件 換到列數為8的時候 方案數++

然後繼續返回上一層 …巴拉巴拉 然後如果找不到了 就到列數為6 的時候 後面就不細說了

是不是完完全全就是乙個經典的搜尋??

這個就是搜尋的判斷條件(以及遞迴出口 改變了)

本質的核心思想就是搜尋

而上個列子就是比較簡單的排列

#include

int record[92]

[9], mark[9]

, count =0;

//record記錄全部解,mark記錄當前解;

bool range[9]

, line1[17]

, line2[17]

;//分別記錄列方向,45度,135度方向上被控制的情況

八皇后 全排列 C語言

問題描述 在乙個8 8的西洋棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列和同一斜線上,問有多少種擺法。思路 因為每行 每列都只能有乙個皇后,因此可以按照行來看,對每行皇后所在的列做乙個標記。每個後可以按照行來看,那麼每個列數可以看作乙個全排列。上圖所表示的全排列為 6...

八皇后問題 之全排列解法

問題的分解一共有兩步 1.生成問題的所有候選解空間 2.過濾掉那些不滿足要求的細化這兩步,需要認識到下面兩點 1.八皇后所有候選解空間是 1,2,3,4,5,6,7,8 這個集合中元素的全排列 這個全排列不僅列出了候選解,並且還自動規避掉了皇后在橫 豎方向上攻擊的問題 2.接下來八皇后相互攻擊的問題...

全排列(遞迴) C 實現

給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小的排列在前面。...