一、回溯方法
回溯方法通常用在:从一个指定集合中选择一个对象序列,使该序列满足某一标准。
所谓回溯,我们将问题构建成一个树,在确定一个节点只会引向死胡同时,我们回退到该节点的父节点,在下一个节点继续查找。
二、透过问题分析算法
n皇后问题
n皇后问题是指我们在nxn的棋盘上放置n个皇后,使任何两个皇后之间不相互威胁。即他们不在同一行、同一列,同一对角线。
我们以4皇后来做假设。4*4*4*4 = 256种答案。
假设一个a[5][5]的棋盘
一个空父节点
1、a[1][1]有希望,以它为下一点的父节点
2、a[2][1]同一行,无希望。
a[2][2]同一对角线,无希望
a[2][3]有希望,以它为下一个的父节点。
3、a[3][1]同一行无希望
a[3][2]同一对角线,无希望
a[3][3]同一行,无希望
a[3][4]无希望,所有子节点都不可以,回退到a[1][1].
4、回退到a[1][1]
a[2][4]有希望。
5、。。。。。
继续下去可以得到结果。
伪代码如下
1 void expand(node v){ 2 node u; 3 for(v中的每个子节点){ 4 if(promings(u)){ 5 if(在u处有一个答案) 6 写出该答案 7 else 8 expand(u) 9 } 10 } 11 }
promings(u)判断u点是否有希望。即在这里面判断是否存在皇后会威胁到其他皇后。
总结:回溯算法的思想便是,将问题先构建成一个空间树,从一个父节点引向若干子节点,当某条路径没有希望时,舍去该节点,回溯到该节点的父节点,在遍历父节点的其他子节点,直至找到答案。