看来看去还是这篇博客比较简洁明了
https://www.cnblogs.com/My-Sunshine/p/4985366.html
顺便给出牛客网的一道题,虽然这道题用dfs写出全排列也能做,题意小心理解,后面给出题目和别人AC代码吧,手动心累。
https://www.nowcoder.com/acm/contest/156/D
这个函数包含在头文件 include <algorithm> 里面
基本格式
do { ... }while(next_permutation(a, a + n));
#include <iostream> #include <algorithm> using namespace std; const int MAXN = 10005; int main() { int n; while(cin >> n && n) { int a[MAXN]; for(int i = 0;i < n;++i) cin >> a[i]; // 因为这个 next_permutation() 是按字典序排序结束的,所以要先 sort 排序 // 自己可以试试把 sort 去掉会有什么结果 // 返回值据说是 bool 类型 sort(a, a + n); do { for(int i = 0;i < n;++i) cout << a[i] << " "; cout << endl; }while(next_permutation(a, a + n)); } return 0; }
输入
3
3 2 1
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
****************************************
把 sort 去掉后
输入
3
3 2 1
输出
3 2 1
******************************************
链接:https://www.nowcoder.com/acm/contest/156/D
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
托米没有完成上一个任务,准备施展黑魔法推倒 1317
而咒语的总伤害为所有 'a'... 'i' 的排列造成的伤害值之和,托米能打出多少点的伤害,是否能击败 1317 呢?
黑魔法咒语被描述为一个 长为 n 的,仅包含小写英文字母 'a'...'i' 的字符串,在托米所在的星球,魔法造成的每次有效伤害都是来自他的一个子序列,对于每一个 'a'... 'i' 的排列(共 9! 种),若作为咒语的子序列出现, 就会造成 1 的伤害
输入描述:
一行输入一个字符串 s
输出描述:
一行输出一个数,表示伤害值
备注:
|s| ≤ 3000
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 char str[4005]; 7 8 int main() 9 { 10 char ss[]={"abcdefghi"}; 11 scanf("%s",str); 12 register int ans=0; 13 do{ 14 register int i=0,j=0; 15 while(i<9&&str[j]) 16 { 17 if(ss[i]==str[j]){ 18 i++,j++; 19 }else{ 20 j++; 21 } 22 } 23 if(i==9) ans++; 24 }while(next_permutation(ss,ss+9)); 25 printf("%d ",ans); 26 return 0; 27 }