排列数字[全排列]

把搜索的过程想象成一棵树,一共有n个位置需要填写,我们的顺序是从第一个位置开始向后填写,在过程中需要注意记录哪些数字还没有填写,还有,记得恢复状态

//枚举第u个位置
void dfs(int u)
{
	if(已经遍历完)
    {
    	输出结果;
        return;
    }
    for()
    {
    	遍历每个可能转移到的状态;
        做出改变;
        dfs(下一层);
        恢复状态;
    }
}
//全排列问题
#include<iostream>

using namespace std;

const int N = 10;

int n;
int path[N];
bool st[N];//true表示这个点已经被使用过了

void dfs(int u)
{
    if(u == n)
    {
        for(int i = 0; i < n; i++)
            cout << path[i] <<" ";
        cout << endl;
        return;
    }
    for(int i = 1; i <= n; i++)
    {
        if(!st[i])
        {
            path[u] = i;//填写第u个位置
            st[i] = true;
            dfs(u+1);//进入下一层
            //恢复状态
            path[u] = 0;
            st[i] = false;
        }
    }
}

int main()
{
    cin >> n;
    dfs(0);
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务