8皇后问题的各种解法
2016-07-10 13:30
363 查看
总体上分为回溯和全排列
全排列(递归)
回溯(递归)
参考:http://www.cnblogs.com/codingmylife/archive/2012/10/04/2711839.html
全排列(递归)
#include <iostream> #include <algorithm> using namespace std; template <size_t N> struct ArraySizeHelper { char _ ; }; template <typename T, size_t N> ArraySizeHelper<N> makeArraySizeHelper(T(&) ); #define ARRAY_SIZE(a) sizeof(makeArraySizeHelper(a)) bool valid_permutation(const int *queen, int len) { bool valid = true; for (int i = 0; i < len; ++i) { for (int j = i + 1; j < len; ++j) { if (queen[j] - queen[i] == j - i || queen[j] - queen[i] == i - j) { valid = false; } } } return valid; } void permutation(int *queen, int len, int idx, int &count) { if (idx == len) { if (valid_permutation(queen, len)) ++count; } else { for (int i = idx; i < len; ++i) { swap(queen[i], queen[idx]); permutation(queen, len, idx + 1, count); swap(queen[i], queen[idx]); } } } // Solved by permutation recursion. int eightqueen_permutation_recur() { int queen[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; int count = 0; permutation(queen, (int)ARRAY_SIZE(queen), 0, count); return count; } int main() { cout << eightqueen_permutation_recur() << endl; system("pause"); return 0; }
回溯(递归)
#include <iostream> #include <algorithm> using namespace std; template <size_t N> struct ArraySizeHelper { char _ ; }; template <typename T, size_t N> ArraySizeHelper<N> makeArraySizeHelper(T(&) ); #define ARRAY_SIZE(a) sizeof(makeArraySizeHelper(a)) bool valid_backtracking(const int *queen, int len) { for (int i = 0; i < len; ++i) { const int diff = abs(queen[i] - queen[len]); if (diff == 0 || diff == len - i) return false; } return true; } void placequeen(int *queen, int len, int idx, int &count) { if (idx == len) { ++count; } else { for (int i = 0; i < len; ++i) { queen[idx] = i; if (valid_backtracking(queen, idx)) { placequeen(queen, len, idx + 1, count); } } } } // Solved by backtracking(DFS) recursion. int eightqueen_backtracking_recur() { int queen[8]; int count = 0; placequeen(queen, (int)ARRAY_SIZE(queen), 0, count); return count; } int main() { cout << eightqueen_backtracking_recur() << endl; system("pause"); return 0; }
参考:http://www.cnblogs.com/codingmylife/archive/2012/10/04/2711839.html
相关文章推荐
- 文件编码方式的分析与理解
- PHP之正则函数
- LeetCode 98. Validate Binary Search Tree
- stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
- 如何正確的使用迴圈(使用for_each)
- sql 查询表的所有列信息
- (转)所谓情商高,就是要把别人放在心上
- 16.18
- TabBarController简单介绍
- java单元测试junit
- asp.net中,用Ajax实现客户端调用服务器端的函数(PageMethods)
- 在linux系统中,卸载本机默认安装的jdk
- Java XML解析之SAX解析
- Kakfa揭秘 Day9 KafkaReceiver源码解析
- 张国祥老师应邀在上海为卓越经理人讲授流程建设与优化课程
- 使用CXF框架搭建WebService服务接口
- Codevs 1702 素数判定 2(Fermat定理)
- 寒战2II 观后感
- 关于博客园与CSDN博客同步的说明
- Java中只有按值传递,没有按引用传递