分治法求解全排列问题

给你一囗甜甜゛ 提交于 2020-03-29 17:56:11

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

时间限制: 1 Sec  内存限制: 128 MB
提交: 2896  解决: 1431
[状态] [讨论版] [提交] [命题人:外部导入]

题目描述

设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的全排列。

样例输入 Copy

1
2
3

样例输出 Copy

1 
1 2 
2 1 
1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 2 1 
3 1 2 AC代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[1005];

void per(int n,int m) {
    if (m == n) {
        for (int i = 0; i < n; i++)
            cout << a[i] << " ";
        cout << endl;
        return;
    }
    else {
        for (int i = m; i < n; i++) {//后m个数进行全排列
            swap(a[i], a[m]);
            per(n, m + 1);
            swap(a[i], a[m]);
        }
    }

}

int main()
{ 
    cin >> n;
    for (int i = 0; i < n; i++) {
        a[i] = i + 1;
    }
    per(n, 0);
    
}

假如求n个元素全排列,n的全排列可以分治为n和n-1个元素全排列,n-1的全排列又可以分治为n-1和n-2个元素全排列...

 

 

 以123为例首先在123中1和1交换然后23中2和2交换然后3当中,3和3交换,所以第一次排列完后的为123

然后23中2和3交换然后2当中,2和2交换,第二次就是132...

依此类推...相同颜色的就是相同元素个数的交换

 


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