全排列(回溯法与next_permutation)

版权声明:即使允许了也不得转载 https://blog.csdn.net/weixin_43213056/article/details/88756200

深度搜索模板的套路:
先判断是否达到目标状态
如果达到,判断当前状态是否合法是否计入答案。
未达到,枚举可能的状态,记录本轮选择,进入下一层。
返回后,消除影响。

全排列(DFS)

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int vis[10];//用于标记是否被访问过,0--未访问  1--已访问
int ans[10];//用于存储答案
int n;

void dfs(int step)
{
    for(int i = 1; i <= n; i++)
    {
        if(vis[i] == 0)
        {
            vis[i] = 1;
            ans[step] = i;//将答案存储

            if(step < n) //调用递归
                dfs(step + 1); //即相当于再一次从头执行一个dfs函数,可以理解为一个嵌套
            else
            {
                for(int i = 1; i <= n; i++){
                    
                    printf("%d",ans[i]);
                    
                    if(i != n)  //用于控制输出格式
                        printf(" ");
                    else
                        printf("\n");
                }
            }
            vis[i] = 0; //访问完毕返回标记为可访问
                        //只有当输出了一个结果后才有可能执行
        }
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis, 0, sizeof(vis));
        dfs(1);
    }
    return 0;
}

next_permutation方法:

#include <iostream>
#include <algorithm>
using namespace std;
int a[3] = { 1,2,3 };
int main()
{
	do
	{
		cout << a[0] << " " << a[1] << " " << a[2] << endl;
	} while (next_permutation(a, a + 3));
	return 0;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/weixin_43213056/article/details/88756200