dfs-1 全排列

一个超简单的全排列问题

最近开始学习了一点dfs,做了一点水题.....
水题虽然是水题,但不做水题怎么做更难的题呢说的还挺有道理
然后呢,就写一哈我的一点心得体会

#include<bits/stdc++.h>
using namespace std;
int a[10],b[10]={0},n;
void dfs(int step){
    int i;
    if(step==n+1){
        for(i=1;i<=n;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
        return;
    }
    for(i=1;i<=n;i++){
        if(b[i]==0){
            b[i]=1;
            a[step]=i;
            dfs(step+1);
            b[i]=0;
        }
    } 
    return;
} 
int main(){
    scanf("%d",&n);
    dfs(1);
    return 0; 
}

代码我也已经弄出来了,对大佬们来说弱智的一批,但对于我这种蒟蒻来说还是有一丢丢难度的,
怎么说呢,算法的思想我其实是能理解的,但在具体的实现过程中我搞不懂为什么第一次排列出1 2 3,之后第二次会出现1 3 2,之后等等一些排列不同的数,然后我就debug了一下,终于发现了问题所在,这个排列的数字之所以每次都不一样是由这个for循环中的i来控制的,dfs函数从上一级跳出来之后,可能有的for循环还没有结束,所以还会在进行循环,这样就会导致每次排数的顺序不同,就是这么简单,但我居然没能很快的反应过来,真是太辣鸡了!!!!

转载于:https://www.cnblogs.com/jljleo/p/11448778.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值