题目
按字典顺序输出错位排列
输入
n
输出
所有的错位排列,一行一个
思路
我,特别特别特别懒所以直接拿全排列改了。。。详见:
https://blog.csdn.net/qq_42937087/article/details/81910492
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[11],j=1,k,p,l;
bool t;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
a[i]=i;
for(int i=2;i<=n;i++) j=j*i;
for(int i=1;i<=j;i++){
t=false;
for(k=1;k<=n;k++) if(a[k]==k) {
t=true;break;
}
if(t==false){
for(k=1;k<=n;k++)
printf("%d ",a[k]);
printf("\n");
}
if(i==j) break;
for(k=n-1;k>=1;k--)
if(a[k]<a[k+1]) break;
p=k+1;
for(l=k+1;l<=n;l++)
if(a[l]>a[k]&&a[l]<a[p]) p=l;
l=a[p];a[p]=a[k];a[k]=l;
sort(a+1+k,a+1+n);
}
return 0;
}