全排列问题
2017-10-19 16:47
148 查看
洛谷 P1706 全排列问题
只是为了记录一下C++的一个神奇用法,调用STL库的函数,直接生成全排列,不过也有全排列的模板
一般给你无序的一组数字的时候,最好先排序一下。下面的自动生成也只会是生成这个a数组中所用有的数字。如果输入的是1 2 3 3.那么它给你生成的排列会是这样子的
只是为了记录一下C++的一个神奇用法,调用STL库的函数,直接生成全排列,不过也有全排列的模板
一般给你无序的一组数字的时候,最好先排序一下。下面的自动生成也只会是生成这个a数组中所用有的数字。如果输入的是1 2 3 3.那么它给你生成的排列会是这样子的
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm>//用到next_permutation的头文件 #include<cmath> #include<iomanip>//调用控制场宽的头文件 using namespace std; int n,a[10]; int main(){ scanf("%d",&n); for(register int i=1;i<=n;++i) a[i]=i; do{ for(register int i=1;i<=n;++i) cout<<setw(5)<<a[i];//目前只知道用cout输出的。。。 printf("\n"); }while(next_permutation(a+1,a+1+n)); //这个就是用STL库写的。 }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; int a[10],b[10],n,r,sum; void print(){ sum++; for(int i=1;i<=n;++i) cout<<setw(5)<<a[i]; //这里也用到了场宽 //要生成r个数,n就可以改成r cout<<endl; } int search(int k){ int i; for(i=1;i<=n;++i) if(!b[i]){ a[k]=i; b[i]=1; if(k==n) print(); //如果只是生成r个数的排列,将这里的n改为r即可 else search(k+1); b[i]=0; } } int main(){ scanf("%d",&n); search(1); }