Acwing 算法基础——BFS——842排列数字

//BFS是指深度优先搜索,它从某个节点开始一直寻找到这个点的叶子节点,之后才会回溯到这个叶子节点的上一个父节点,再从这个父节点开始搜索。

Acwing842. 排列数字

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 nn。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<iostream>
using namespace std;
const int N=10;
int n;
/*
 * 对于一颗树而言,BFS会从一个节点一轮寻找到叶子节点,我们称这条路径为一个解向量
 */
int path[N];//存储这个解向量
bool str[N];//很难一句话解释它的作用,在本题中,它表示我们是否使用过这个数字,通过它我们可以确定我们是否“拜访”过这个节点
void dfs(int u){//如何理解u这个变量?在本题中,它表示遍历过程中选定数字的个数
    if(u==n){//表示我们从根节点走了一条路到叶子节点,则这条路径的解向量是本题的一个解
        for(int i=0;i<n;i++) cout<<path[i]<<" ";
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++){//要注意这里的i和上面i的区别,上面的i只是单纯的循环变量,遍历输出整个整个解向量;这里的i和循环配合str[]用于查找我们是否可以选这个数字
        if(!str[i]){
            path[u]=i;
            str[i]=true;
            //如果没有被选过,则选定该数字,再进行一次dfs
            dfs(u+1);
            //这里也是BFS以及回溯中最重要的部分了,为什么要让这个数字再次“不被选中”?
            //我们可以想象 比如说n=3的时候 我们选完了第一个数字为1的情况,就要“移除”这种情况,选择其他的节点
            //这里要配合递归是一个栈以及循环来思考
            str[i]=false;
        }
    }
}
int main(){
    scanf("%d",&n);
    dfs(0);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值