dfs 全排列算法(含重复元素)

1、数的全排列

求数字 1 ~ n 的全排列,例如 1~3 的全排列,输出 1 2 3, 1 3 2 , 2 1 3, 2 3 1, 3 1 2, 3 2 1

#include
using namespace std;

#define runfile freopen("E:/Code/CB/Root/data.txt", "r", stdin)
#define stopfile fclose(stdin)

const int maxn = 100;
int n,vis[maxn],perm[maxn];//标记数组,全排列

void dfs(int step)//全排列,step 为当前选择元素的数量
{
    if(step == n+1)//已经选满 n 个数,得到全排列,深搜结束
    {
        for(int i = 1; i <= n; i++)
        {
            cout<>n)
    {
        memset(vis, 0, sizeof(vis));
        dfs(1);
    }

//    stopfile;
    return 0;
}

2、字符的全排列

#include
using namespace std;

#define runfile freopen("E:/Code/CB/Root/data.txt", "r", stdin)
#define stopfile fclose(stdin)

const int maxn = 100;
int n,vis[200];//标记数组,全排列
char s[maxn],perm[maxn];

void dfs(int step)//全排列,step 为当前选择元素的数量
{
    if(step == n+1)//已经选满 n 个数,得到全排列,深搜结束
    {
        for(int i = 1; i <= n; i++)
        {
            cout<

3、含重复元素的全排列(首先要强制排序,然后再回溯的过程中记录上一个值的位置,保证相同的元素不会进行互换)

#include
using namespace std;

#define runfile freopen("E:/Code/CB/Root/data.txt", "r", stdin)
#define stopfile fclose(stdin)

const int maxn = 100;
int n,vis[maxn],pre;//标记数组,全排列
char s[maxn],perm[maxn];

void dfs(int step)//全排列,step 为当前选择元素的数量
{
    if(step == n+1)//已经选满 n 个数,得到全排列,深搜结束
    {
        for(int i = 1; i <= n; i++)
        {
            cout<

 

你可能感兴趣的:(DFS,搜索----------全排列)