当前位置: 首页 > news >正文

蓝桥杯省赛—dfs算法

一.题目

二.代码实现

public class Main {
    public static int max = 0;//结果
    public static int x;//数组大小
    public static boolean[] b;//判断数组
    public static int[] array;//数组记录
    public static int start;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        x = scan.nextInt();
        b = new boolean[x+1];
        array = new int[x+1];
        for(int i = 1;i<=x;i++) array[i] = scan.nextInt();
        for(int i = 1;i<=x;i++)
        {
            start = i;
            dfs(i,0);
        }
        System.out.println(max);
        scan.close();
    }
    public static void dfs(int n,int size)//终止位置,尺寸
    {
        if(b[n])
        {
            if(start == n && max<size)//起始与终止指向一个人
            {
                max = size;
            }
            return;
        }
        if(b[n]==false)//说明这个结点没有被访问过
        {
            b[n] = true;
            dfs(array[n],size+1);
            b[n] = false;//进行回溯
        }
    }
}

三.解析

首先分析问题,这道题为什么要用dfs算法?

我们很容易想到对每一种可能进行枚举来解决这道题,那么dfs算法不就是通过回溯枚举出每一种可能的算法吗

dfs算法怎么使用?

1.首先创建一个boolean数组,用于判断是否访问过对应结点

2.确定方法的参数

2.设置得到答案的语句,这一步我觉得也是最困难的一步

3.判断递归位置来进行回溯,注意回溯一定是在递归语句的上面

回到这道题本身,要求我们找出能围城全的最大个数

不要被“要崇拜的对象一定要坐在我们的右手边迷惑了”,什么时候能围城一个圈呢,只有当最后一个人与我们起始的那个人是一个人时才能围成一个圈,所以我们的输出判断语句条件也就是这个,并且只有当当前围成圈的个数大于我们记录的最大个数时才继续赋值

相关文章:

  • 完整版已注册,永久授权!
  • USER32!GetPropW函数分析之获取窗口属性
  • Python刷题:Python基础
  • C/S架构与B/S架构(C语言)
  • 多 Agent 博弈有哪些典型案例
  • 【Linux】冯诺依曼体系与操作系统理解
  • MouseBoost Pro for Mac 鼠标右键助手右键菜单
  • DeepSeek 各版本的区别
  • DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)
  • 【Qt】自定义信号和槽函数
  • 神经紊乱怎么治才能彻底除根
  • 解决电脑问题(8)——网络问题
  • MySQL安装过程,创建数据库
  • java通用自研接口限流组件
  • C++基础系列【20】数据结构与算法基础
  • 基于springboot的档案管理系统
  • 企业级VPN与零信任客户端的深度隐私防护指南
  • C语言练习题--洛谷P1781宇宙总统
  • 深入浅出解析 FreeRTOS 软件定时器 定时器服务任务:机制、API 详解及实践应用
  • 【算法】009、单双链表反转
  • dedecms 网站地图模板/如何制作自己的网页链接
  • 网站建设相关技术/班级优化大师网页版登录
  • 网站广告推广怎么做/seo综合查询网站源码
  • 东莞网站建设平台/怎么查百度搜索排名
  • 网站企业建设/长沙seo网站排名优化公司
  • 网站建设 ur建站/苏州seo快速优化