全排列算法递归及STL实现,八皇后问题
2013-03-24 14:21
651 查看
一种网上流传的递归型全排列算法,原创不详。只不知如果数组中有重复的元素的话何解?
在/article/1422845.html看到STL的思路实现的全排列
STL有一个函数next_permutation(),它的作用是如果对于一个序列,存在按照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。注意,为了产生全排列,这个序列要是有序的,也就是说要调用一次sort。
由全排列算法联想到一个经典问题:八皇后问题
#include <iostream> void permutation(char* list, int begin, int end) { if(begin < end) { for(int i = begin; i <= end; ++i) { std::swap(list[i], list[begin]); permutation(list, begin + 1, end); std::swap(list[i], list[begin]); } } else { for(int i = 0; i <= end; ++i){ std::cout << list[i]; } std::cout << std::endl; } } int main() { char a[] = "1234"; std::cout << a << "的全排列结果如下:" << std::endl; permutation(a, 0, (int)strlen(a) - 1); return 0; }
在/article/1422845.html看到STL的思路实现的全排列
STL有一个函数next_permutation(),它的作用是如果对于一个序列,存在按照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。注意,为了产生全排列,这个序列要是有序的,也就是说要调用一次sort。
#include <iostream> #include <algorithm> void permutation(char* list, int length) { std::sort(list, list + length); do { for(int i = 0; i < length; ++i) { std::cout << list[i]; } std::cout << std::endl; }while(std::next_permutation(list, list + length)); } int main() { char a[] = "1234"; std::cout << a << "的全排列结果如下:" << std::endl; permutation(a, (int)strlen(a)); return 0; }
由全排列算法联想到一个经典问题:八皇后问题
/* ----- eight queen ----- */ #include <iostream> #include <algorithm> int g_number = 0; void printQueen(int list[], int length) { printf("queenList[%d]:\t", g_number); for (int i = 0; i < length; ++i) { printf("%d ", list[i]); } printf("\r\n"); } bool check(int list[], int length) { for (int i = 0; i < length; ++i) { for (int j = i + 1; j < length; ++j) { if ( (i - j == list[i] - list[j]) || (i - j == list[j] - list[i]) ) { return false; } } } return true; } void permutation(int ColumnIndex[], int index, int length) { if (index == length) { if(check(ColumnIndex, length)) { ++g_number; printQueen(ColumnIndex, length); } } else { for(int i = index; i < length; ++ i) { std::swap(ColumnIndex[i], ColumnIndex[index]); permutation(ColumnIndex, index + 1, length); std::swap(ColumnIndex[i], ColumnIndex[index]); } } } void eightQueen() { const int queenCount = 8; int queenList[queenCount]; for (int i = 0; i < queenCount; ++i) { queenList[i] = i; } permutation(queenList, 0, queenCount); } int main(int argc, char const *argv[]) { eightQueen(); return 0; }
相关文章推荐
- 全排列问题算法实现--递归
- 全排列问题算法分析与实现(递归、非递归)
- 全排列问题的递归、STL实现
- Java基于循环递归回溯实现八皇后问题算法示例
- 全排列问题 递归实现
- 全排列算法递归实现(Permutations)
- 算法java实现--回溯法--圆排列问题--排列树
- 递归实现hanoi塔问题算法
- 【算法设计与分析】递归与分治----2.4 排列问题
- 排列组合算法的递归实现
- 递归和分治思想4|八皇后问题 – 数据结构和算法34
- 八皇后问题详细推导(递归和非递归,Go语言实现)
- 全排列算法递归实现
- 全排列递归实现算法
- 八皇后问题C++泛型算法实现
- 全排列问题、八皇后问题、组合问题的递归解法
- 字符串的全排列非递归实现算法
- 0002算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
- 全排列问题算法及实现(Permutation)
- 全排列算法非递归实现和递归实现