next_permutation是C++ STL中的<algorithm>库里的一个函数。它的功能是计算一个数组的给定的第一个数到最后一个数按照字典序所得的下一个排列。如果这个排列存在,那么就return这个排列,否则就return一个bool值false。(相当于prev_permutation的逆运算)
这个题可以直接应用上面函数解决。首先,我们先定义好头文件(不要忘记algorithm),定义好数组并进行读入,就像这样:
#include<iostream> #include<algorithm> using namespace std; int n,i; int num[10]; int main(){ cin>>n; return 0; }
接下来我们要进行初始化。因为题目要求正序输出,所以我们要先初始化成正序,同时,为了后面调用函数方便,要进行输出,就像这样:
for(i=1;i<=n;i++){ num[i]=i;//初始化 cout<<" "<<num[i]; } cout<<endl;
然后我们要开一个循环,不断地调用这个函数,直到该函数return false为止。若未return false,则需进行输出。
while(1){ if(next_permutation(num+1,num+n+1)==false){//不能再排列 return 0; }else{ for(i=1;i<=n;i++){ cout<<" "<<num[i]; } cout<<endl; } }
最后是完整代码:
#include<iostream> #include<algorithm> using namespace std; int n,i; int num[10]; int main(){ cin>>n; for(i=1;i<=n;i++){ num[i]=i;//初始化 cout<<" "<<num[i]; } cout<<endl; while(1){ if(next_permutation(num+1,num+n+1)==false){//不能再排列 return 0; }else{ for(i=1;i<=n;i++){ cout<<" "<<num[i]; } cout<<endl; } } return 0; }
这样就可以AC了!
最后说一句,STL大法好!