回溯法之排列树

当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为
排列树。例如:
旅行售货员问题   回溯法搜索排列树的描述为:        void backtrack(int  t)       {        if(t>n)                output(x);        else                   for(int i=t; i<=n; i++)
//这里的n表示层数,不要和子集树搞混了           {             swap(x[t], x[i]);             if(constraint(t) && bound(t))      backtrack(t+1);             swap(x[t], x[i]);                   }           }

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

#include <vector>

#include <queue>

#include <stack>

using namespace std;

void printVector(vector<int> array );

void dfs(vector<int>& array, int t)

{

    size_t size =  array.size();

    //只有满足t==size才可以输出

    if(t == size)

        printVector(array);

    //dfs to the next level

    for(int i = t; i < size; i++)

    {

       swap(array[t],array[i]);

       dfs(array, t+1);

       swap(array[i],array[t]);

    }

}

void printVector(vector<int> array )

{

    for(int i = 0; i <array.size(); i++)

        cout << array[i]<< “\t” ;

    cout << endl;

}

//dfs(b,t),t的值决定了对t之后的数进行全排列,当t为0时是全部,t为1时是第一个数字之后

int main()

{

    vector<int> b;

    int i;

    for(i=1;i<=5;i++){

        b.push_back(i);

    }

    dfs(b, 0);

    return 0;

}

打印结果

5 6 7 8
5 6 8 7
5 7 6 8
5 7 8 6
5 8 7 6
5 8 6 7
6 5 7 8
6 5 8 7
6 7 5 8
6 7 8 5
6 8 7 5
6 8 5 7
7 6 5 8
7 6 8 5
7 5 6 8
7 5 8 6
7 8 5 6
7 8 6 5
8 6 7 5
8 6 5 7
8 7 6 5
8 7 5 6
8 5 7 6
8 5 6 7

    原文作者:回溯法
    原文地址: https://blog.csdn.net/dreamjay1997/article/details/78696505
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞