之前一直没有正儿八经写过排列算法,顶多就是把经过一些化妆后的排列算法作为一个子算法混在大算法里面,今天看书时突然发现排列算法的影子无处不在,TSP问题就是从众多排列中选出最佳排列的问题。下面是利用递归思想的排列算法代码,其中的visited数组有一个俗称叫“禁忌表”,另外调用递归函数之后一定不要忘了恢复“原貌”喔!
#include <cstdio>
#include <vector>
using namespace std;
int cnt;
void permutate(vector<int> &permutation, vector<bool> &visited, int cur, int n, int k) {
if(cur == k) {
for(int j = 0; j < cur; j++) {
printf("%d ", permutation[j]);
}
printf("\n");
cnt++;
return;
}
for(int i = 1; i <= n; i++) {
if(!visited[i]) {
visited[i] = true;
permutation[cur] = i;
permutate(permutation, visited, cur+1, n, k);
visited[i] = false;
}
}
}
int main()
{
/* 从n个数中取k个数的排列 */
int n, k;
scanf("%d%d", &n, &k);
vector<int> permutation(n);
vector<bool> visited(n+1, false);
cnt = 0;
permutate(permutation, visited, 0, n, k);
printf("%d\n", cnt);
return 0;
}