八皇后问题——回溯深搜
2012-03-22 16:44
337 查看
回溯法解决八皇后问题
回溯发的步骤:
从第一行开始进行,设前i-1行上的皇后已经布局好,互不攻击。现考虑第i行上的皇后的位置,
使之与前i-1行上的皇后也都互不攻击。
(1)检查第i行上的皇后与前i-1行的皇后是否互不攻击。若有攻击,则将第i行上的皇后右移一个位置,
重新进行这个过程;若无攻击,则考虑安排下一行上的皇后位置。
(2)若安排好的皇后是最后一行,则说明已经找到了8个皇后互不攻击的一个布局,将这个布局输出,
然后将该行上的皇后右移一个位置,重新进行这个过程,以便寻找下一个布局。
View Code
回溯发的步骤:
从第一行开始进行,设前i-1行上的皇后已经布局好,互不攻击。现考虑第i行上的皇后的位置,
使之与前i-1行上的皇后也都互不攻击。
(1)检查第i行上的皇后与前i-1行的皇后是否互不攻击。若有攻击,则将第i行上的皇后右移一个位置,
重新进行这个过程;若无攻击,则考虑安排下一行上的皇后位置。
(2)若安排好的皇后是最后一行,则说明已经找到了8个皇后互不攻击的一个布局,将这个布局输出,
然后将该行上的皇后右移一个位置,重新进行这个过程,以便寻找下一个布局。
View Code
#include<iostream> using namespace std; bool rvisit[8]; bool cvisit[8]; bool dialvisit[15]; bool adialvisit[15]; int sheme; void dfs(int i, int ct) { if(ct == 8){ sheme ++; return ; } if(i >= 8){ return ; } dfs(i + 1, ct); for(int j = 0; j < 8; j ++){ if(!rvisit[i] && !cvisit[j] && !dialvisit[i + j] && !adialvisit[i - j + 7]){ rvisit[i] = true; cvisit[j] = true; dialvisit[i + j] = true; adialvisit[i - j + 7] = true; dfs(i + 1, ct + 1); rvisit[i] = false; cvisit[j] = false; dialvisit[i + j] = false; adialvisit[i - j + 7] = false; } } } int main() { memset(rvisit, false, sizeof(rvisit)); memset(cvisit, false, sizeof(cvisit)); memset(dialvisit, false, sizeof(dialvisit)); memset(adialvisit, false, sizeof(adialvisit)); sheme = 0; dfs(0, 0); cout << sheme << endl; system("pause"); }
相关文章推荐
- Dijkstra求含权图最短通路;试探与回溯保证枚举的不遗漏不重复;国际象棋八皇后问题
- 回溯法与八皇后问题
- 回溯法——八皇后问题
- 八皇后问题——深度优先搜索和回溯
- 回溯法:八皇后问题
- 八皇后问题(递归、非递归——回溯)
- 八皇后问题--回溯
- 回溯法:应用举例--八皇后问题
- Java基于循环递归回溯实现八皇后问题算法示例
- 八皇后问题的回溯算法
- 八皇后问题 回溯 非递归 java
- 回溯法解八皇后问题
- 回溯法解八皇后问题及再看八皇后问题优化
- 八皇后问题 DFS,回溯剪枝 //http://poj.grids.cn/practice/2698
- uva 11553 Grid Game (回溯- 类似,比八皇后问题简单)
- 回溯法-八皇后问题之C实现
- 八皇后问题回溯算法演示系统
- 回溯问题:八皇后
- 回溯算法思想与八皇后问题解的个数
- 回溯算法--八皇后问题