【回溯】全排列

来源:互联网 发布:mac svn客户端使用教程 编辑:程序博客网 时间:2024/05/16 06:15

实际上是一种深度优先的算法。

回溯的思想:撞了南墙就回头,直到罗马,到了罗马一回头就是来时的路。


#include <iostream>using namespace std;void swap(int &a,int &b)//交换两个元素{    int tem;    tem = a;    a = b;    b = tem;}int sum=0;void cal(int *a,int first,int end){    if(first == end)//如果递归到深层时,到最后交换的元素即时最后一个元素时就打印出来    {        sum++;        for(int i = 0; i <= end; i++)        cout<<a[i]<<" ";        cout<<endl;    }    else    {        for(int i = first; i <= end; i++)        {//循环遍历使得当前位置后边的每一个元素都和当前深度的第一个元素交换一次            swap(a[first],a[i]);//使得与第一个元素交换            cal(a,first+1,end);//深入递归,此时已确定前边的元素,处理后边子序列的全排列形式。            swap(a[first],a[i]);//恢复交换之前的状态        }    }}int main(){     int a[4] = {1,2,3,4};    cal(a,0,3);    cout<<"一共"<<sum<<"种排列";    system("pause");    return 0;}