一、next-permutation(元素必须有序)
元素有重无重都可
#include<cstdio>
#include<algorithm>
using namespace std;
int a[] = {1, 2, 3, 4, 5};
int ans = 0;
void f() {
do{
for(int i = 0; i < 5; i++) printf("%d", a[i]);
printf("\n");
ans++;
}while(next_permutation(a, a + 5));
}
int main() {
f();
printf("%d", ans);
return 0;
}
二、交换法(元素必须无重复)
#include<cstdio>
int a[] = {1, 2, 3, 4, 5};
int ans = 0;
void f(int k) {
if(k == 5) {
for(int i = 0; i < 5; i++) printf("%d", a[i]);
printf("\n");
ans++;
return;
}
for(int i = k; i < 5; i++) {
int t = a[i];
a[i] = a[k];
a[k] = t;
f(k + 1);
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
int main() {
f(0);
printf("%d", ans);
return 0;
}
三、抓取法(元素重复时可用)
#include<cstdio>
int a[] = {1, 2, 3, 4, 5};
int path[5];
bool vis[5];
int ans = 0;
void f(int k) {
if(k == 5) {
for(int i = 0; i < 5; i++) printf("%d", path[i]);
printf("\n");
ans++;
return ;
}
for(int i = 0;i < 5; i++) {
if(i > 0 && a[i] == a[i - 1] && !vis[i - 1]) continue;//若此元素与上一元素相同,上一元素没被抓取则此元素不能被抓取
if(!vis[i]) {
vis[i] = true;
path[k] = a[i];
f(k + 1);
vis[i] = false;
}
}
}
int main() {
f(0);
printf("%d", ans);
return 0;
}