问题 A 分治法求解全排列问题

做~自己de王妃 提交于 2019-11-26 12:10:47

题目描述

设R=(1, 2, .., n),计算R的全排列。 分治法求解全排列的算法思想: 设R=(1, 2, .., n)的全排列为P(R), 若R=(),则P()=(); 否则,P(R)={(1)P(2, 3, .., n),(2)P(1, 3, .., n), (3)P(2, 1, .., n), .., (n)P(2, .., n-1, 1)}; 同样地,P(2, 3, .., n)={(2){3, 4, .., n}, (3){2, 4, .., n}, .., (n){3, .., n-1, 2}}

输入

输入为一组不大于7的整数。

输出

对每个输入的整数n,用分治法计算并输出1..n的全排列。

样例输入

123

样例输出

1 1 2 2 1 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<malloc.h>
using namespace std;
void perm(int a[],int k,int m){
    int i;
    if(k==m){
        for(i=0;i<=m;i++)
            printf("%d ",a[i]);
        printf("\n");
        return;
    }
    else{
        for(i=k;i<=m;i++){
            swap(a[i],a[k]);
            perm(a,k+1,m);
            swap(a[i],a[k]);
        }
    }
}
int main(){
    int n;
    int a[100];
    while(~scanf("%d",&n)){
        int i;
        for(i=0;i<n;i++){
            a[i]=i+1;
        }
        perm(a,0,n-1);
    }
    return 0;
}



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!