【非递归】错位排列

题目

按字典顺序输出错位排列
输入
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;
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/81939633