排列数字 (dfs)

希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注~

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯省一你一定不能错过的模板大全(第三期)

蓝桥杯省一你一定不能错过的模板大全(第四期)!!!

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)

蓝桥杯上岸必背!!!(第八期 简单数论)

蓝桥杯上岸必刷!!!(进制、数位专题)

蓝桥杯上岸考点清单 (冲刺版)!!!

题目

排列数字

分析

从前往后填数字,保证后面填的数字和前面不冲突。

需要两个数组:

path[]:记录走过的路径

st[]:标记该路是否被走过

(1)运用DFS搜索+回溯遍历整个二叉树
(2)当走到最后一个点时,输出结果,同时回退到上一层,即return
(3) (2)操作执行完后回溯到上一层,判断上一层的数是否被标记过
若已标记过,则不再更换,再回溯到上一层。
没有标记过,则需要进行更换,再继续dfs()下去,依次类推,直至回溯到根节点。
待整颗树都遍历完,则退出循环。

分析图

DFS2.jpg
注:蓝色上升箭头表示回溯方向

关键代码

return;
表示的是返回到上一层,用于回溯,可有可无,推荐加上,便于理解。
st[i]=false;//恢复现场+回溯
(1)依次将最后一个数标记为false,可以将该数拿来重新用,空出了位置,即为恢复现场。
(2)表示的是在走到最后一个数,再无路可走时,将最后一个数标记为false,表示可以重新用该数进行回溯,结合return,回溯到上一层。
再进行判断是否该数在这一层未被标记,若未标记则可以替换,再dfs下一层。若被标记过,则继续回溯到上一层。依次类推,直至回溯到根节点位置。
其他代码请见注释

代码

//暴搜
import java.util.Scanner;
public class Main{
    static int N=10;
    static int n,u;//n表示总层数,u表示当前在第几层
    static int []path = new int [N];//记录走过的路径
    static boolean []st=new boolean[N];//标记数组
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();//总共有n层
       
        dfs(0);//从根节点0开始dfs递归
    }
    public static void dfs(int u){
        if(u==n){
        //走到第n层,此时无路可走,输出结果。
           
            for(int i=0;i<n;i++) System.out.print(path[i]+" ");
            System.out.println();//每到n个换行
            
            return;
            //返回到上一层,如u=2,返回到上一层为1的位置;
        }
        
        else{
            for(int i=1;i<=n;i++){//从i=1开始,到n结束。
                if(!st[i]){//该数未被标记
                    path[u]=i;
                    //如果i在这一轮循环中的这一层未被标记,则将放在这个位置
                    
                    st[i]=true;//标记路已走过了,不能再走,避免冲突。
                    
                    dfs(u+1);//进入下一层
                    
                    st[i]=false;
                    //将最后一个数设置为未标记,恢复现场,回溯。
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值