回溯:當把問題分成若干個步驟時,如果當前部驟沒有合法選擇,則函式將返回上一級遞迴呼叫,這種現象稱為回溯,因此,遞迴列舉演算法有常被稱為回溯法;
n皇后問題: 思考:1。從64個格仔選出乙個子集使得任意乙個格仔不在同一行同一列同一對角線上,即子集列舉問題,64個格仔的子集有2^64個,太大不夠好
2。從64個格仔裡選出8個格仔,即組合生成問題,有c8 64 =4*10^9 種方案,仍不夠好
繼而發現:恰每行每列格放置乙個皇后,如果用c[x]表示第x行皇后的列,則只有8!=40320種排列
實現: 陣列座標化 同一列 x1=x2 同一主對角線 y1-x1=y2-x2 同一副對角線 y1+x1=y2+x2
用陣列 儲存各皇后 的 這三項引數值
~如果有多組資料,先預處理打表,防止重複計算超時
#include#includeusing
namespace
std;
int c[15],n,ans[15],k=0
;int idx[5][40
];void dfs(int
cur)
for(int i=0;i)
}}int
main()
//freopen("ans.txt","w",stdout);
while(scanf("
%d",&n)!=eof&&n)
}
素數環 uva 524
~事先素數打表
~奇偶剪枝
#includeusingnamespace
std;
int a[20]=,b[20],c[40]=,n,ks=0
;;void dfs(int
cur)
//奇偶剪枝
if(cur%2==1
) }}
else
for(int i=2;i<=n;i+=2
)
}}int
main()
return0;
}
006回溯法 n皇后問題
在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。如下 nqueen by xcz on 2013.9.10 include include...
N皇后問題 12 回溯法 簡單
回溯法,主要應用在dfs中,主要思想是當你push乙個元素後,記住要pop回去,大致的模板是 path.push back nums i dfs pos 1 path.pop 詳細的模板在我們之前用回溯法解決全排列問題有提到。n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后...
hdu1116回溯N皇后問題
題目連線 經過思考,不難發現 恰好n個皇后放在不同行不同列,那麼是不是可以轉換成n個皇后所在行分別確定 一人一行 的情況下對她們的所在列的列舉。也就是列的全排列生成問題,我們用c x 表示x行皇后的列編號。而我們知道0 n 1的排列一共有n的階乘,列舉量不會超過它。if cur n 遞迴邊界。只要走...