八皇后问题(回溯法)

xiaoxiao2021-02-28  213

回溯法:

1)思想:采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案;

2)实现:通常用最简单的递归方法来实现;

3)结果:两种情况:(1) 找到一个可能存在的正确的答案  (2) 在尝试了所有可能的分步方法后宣告该问题没有答案;

4)时间复杂度:由于整个过程需要很多往返,所以时间复杂度最坏可能达到指数级;

八皇后思路:假设某一行为当前状态,不断检查该行所有的位置是否能放一个皇后,检索的状态有两种:

(1)先从首位开始检查,如果不能放置,接着检查该行第二个位置,依次检查下去,直到在该行找到一个可以放置一个皇后的地方,然后保存当前状态,转到下一行重复上述方法的检索。

(2)如果检查了该行所有的位置均不能放置一个皇后,说明上一行皇后放置的位置无法让所有的皇后找到自己合适的位置,因此就要回溯到上一行,重新检查该皇后位置后面的位置。

八皇后代码:

#include <bits/stdc++.h> const int max=8; int queen[max], sum=0; bool place(int n) /* 检查当前列能否放置皇后 */ { int i; for(i = 0; i < n; i++) /* 检查横排和对角线上是否可以放置皇后 */ { if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i)) { return false; } } return true; } void queue(int n) /* 回溯尝试皇后位置,n为横坐标 */ { int i; for(i = 0; i < max; i++) { queen[n] = i; /* 将皇后摆到当前循环到的位置 */ if(place(n)) { if(n == max - 1) { sum++; } else { queue(n + 1); /* 否则继续摆放下一个皇后 */ } } } } int main() { queue(0); printf("%d\n", sum); return 0; }

转载请注明原文地址: https://www.6miu.com/read-28874.html

最新回复(0)