蓝桥杯第1022题 玩具蛇 基础DFS C++ Java

题目

思路和解题方法

  1. 问题理解:此题要求找出将一条由16节正方形构成的玩具蛇放入4x4的方格中的不同方式数。每节蛇可以是直线或直角转弯,且蛇的形状需要完全覆盖盒子里的16个格子,每个格子仅被蛇的一个部分占据。

  2. 状态表示:使用一个二维数组st[4][4]来标记每个格子是否被蛇占用(0表示未占用,1表示占用)。同时,使用深度优先搜索(DFS)来探索所有可能的放置方式。

  3. DFS策略

    • 参数定义dfs(x, y, len)函数中,xy表示当前蛇头的位置坐标,len表示当前已经放置蛇的节段数目。
    • 递归终止条件:当len达到16时,说明蛇的所有部分都已放置完毕,方案数加1。
    • 边界判断与重复检查:每次尝试移动前,先检查新位置是否在边界内以及是否已访问过。
    • 移动方向:对于当前位置,尝试向上、下、左、右四个方向移动,每次移动后递归调用自身,探索新的路径。
    • 回溯:在每个方向探索结束后,需要恢复现场,即撤销当前位置的占用标记,以允许探索其他路径。
  4. 代码实现

    • 首先遍历所有可能的起始位置,对每个起始位置调用dfs函数。
    • dfs函数中,进行上述逻辑处理,包括移动、计数、回溯等操作。

c++ 代码

#include <iostream>
using namespace std;

// 方向数组,dx表示行变化,dy表示列变化,分别对应上、下、左、右四个方向
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};

// st数组用来标记网格中的每个格子是否已经被蛇占用过
int st[4][4];      

// res用于记录可以成功放置玩具蛇的总方案数
int res = 0;       

// 深度优先搜索函数,探索放置蛇的路径
void dfs(int x, int y, int len) {
    // 如果当前位置超出网格范围,则返回
    if (x < 0 || y < 0 || x >= 4 || y >= 4) {
        return;  
    }
    // 如果当前位置已经走过,则返回,避免重复路径
    if (st[x][y] == 1) {
        return;  
    }
    // 如果蛇的长度已经达到15(即全部摆放完毕),方案数加一并返回
    if (len == 15) {
        res++;   
        return;
    }

    // 标记当前位置已被占用
    st[x][y] = 1;  
    // 依次尝试向上、下、左、右四个方向进行下一步探索
    for (int i = 0; i < 4; i++) {
        dfs(x + dx[i], y + dy[i], len + 1);  
    }
    // 回溯:恢复当前位置为未访问状态,以便进行其他路径的探索
    st[x][y] = 0;  
}

// 主函数
int main() {
    // 遍历网格的每一个起点,启动深度优先搜索寻找所有可能的蛇形路径
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            dfs(i, j, 0);
        }
    }
    // 输出所有可行的蛇形路径总数
    cout << res << endl;  
    return 0;
}

Java 版本(仅供参考)

import java.util.Arrays;

public class Main {
    static int[][] st = new int[4][4];      
    static int res = 0;       
    static int[][] dx_dy = {{-1, 0, 1, 0}, {0, -1, 0, 1}};  

    public static void dfs(int x, int y, int len) {
        if (x < 0 || y < 0 || x >= 4 || y >= 4) {
            return;  
        }
        if (st[x][y] == 1) {
            return;  
        }
        if (len == 15) {
            res++;   
            return;
        }

        st[x][y] = 1;  
        for (int i = 0; i < 4; i++) {
            dfs(x + dx_dy[0][i], y + dx_dy[1][i], len + 1);  
        }
        st[x][y] = 0;  
    }

    public static void main(String[] args) {
        Arrays.stream(st).forEach(row -> Arrays.fill(row, 0)); // 初始化st数组
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                dfs(i, j, 0);
            }
        }
        System.out.println(res);  
    }
}

Python 版本(仅供参考)

def dfs(x, y, len):
    if x < 0 or y < 0 or x >= 4 or y >= 4:
        return
    if st[x][y] == 1:
        return
    if len == 15:
        global res
        res += 1
        return

    st[x][y] = 1
    for i in range(4):
        dfs(x + dx[i], y + dy[i], len + 1)
    st[x][y] = 0

dx, dy = [-1, 0, 1, 0], [0, -1, 0, 1]
st = [[0]*4 for _ in range(4)]
res = 0

for i in range(4):
    for j in range(4):
        dfs(i, j, 0)

print(res)

代码细节:

  • 递归函数dfs(x, y, len)负责实际的搜索过程,其中(x, y)是当前探索的位置,len表示已经探索了多少个格子(即蛇的长度)。
  • 边界检查:在尝试移动到新位置之前,先检查新位置是否还在网格范围内,防止越界。
  • 重复检查:通过st数组避免重复访问同一格子,提高搜索效率,减少无效分支。
  • 递归终止条件:当蛇的长度达到16时,说明找到了一个完整的解决方案,累加结果计数器res
  • 回溯:在递归返回前,撤销当前位置的占用标记,以便于从当前节点出发探索其他路径。
  • 全面搜索:通过外层循环遍历所有可能的起始点,确保从每个格子出发都尝试寻找解。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/654176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小猪APP分发:让你的应用轻松上架,免费分发

你是否曾经因为应用无法顺利上架而烦恼&#xff1f;或者&#xff0c;刚刚开发好的应用找不到一个合适的平台进行分发&#xff1f;其实&#xff0c;这些问题都不再是问题&#xff0c;因为“小猪APP分发”来了&#xff01; 每个开发者都希望自己的应用能够被更多的人下载和使用&…

解读vue3源码-1

提示&#xff1a;看到我 请让滚去学习 vue3渲染流程 文章目录 vue3渲染流程vue3的3个核心&#xff1a;1.响应式模块(Reactivity Module)--创建响应式数据2.编译模块(Compiler Module)--模版编译器将html转换为一个渲染函数3.渲染模块(Renderer Module) 渲染流程&#xff1a;1.首…

【torchrl】强化学习训练流程

1 采集数据阶段 上面这个循环是用来采集数据&#xff0c;并且加入到replay buffer中。最终获取的数据是 - s: 当前状态&#xff0c;或者observation - a: 当前动作&#xff0c;后面重要性采样需要用到 - pa: 选择当前动作的概率&#xff0c;后面重要性采样用到 - r: 当前的奖励…

五款局域网监控软件良心推荐

五款局域网监控软件良心推荐 有人问我&#xff0c;能不能推荐几款好用的局域网监控软件。 我说&#xff0c;当然可以了&#xff0c;凭良心说&#xff0c;这几款软件在实用性、用户体验、隐私保护以及性价比上&#xff0c;绝对是当前最强监控软件。 1. 安企神 这款软件支持7天…

智简云携手云器Lakehouse打造一体化大数据平台,释放数据价值

导读 本篇分享的是智简云使用云器Lakehouse升级数据平台的实践总结。 智简云&#xff0c;是一家拥有十余年历史的科技公司&#xff0c;专注于企业服务领域&#xff0c;开发了两款核心产品&#xff1a;基于PASS平台的客户关系管理&#xff08;CRM&#xff09;系统和为中小型用…

生命在于学习——Python人工智能原理(2.1)

二、机器学习 1、机器学习的定义 机器学习是指从有限的观测数据中学习出具有一般性的规律&#xff0c;并利用这些规律对未知数据进行预测的方法&#xff0c;通俗的讲&#xff0c;机器学习就是让计算机从数据中进行自动学习&#xff0c;得到某种知识。 传统的机器学习主要关注…

应用一键跳转,Xinstall助力提升用户体验

在移动互联网时代&#xff0c;App已成为人们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地访问和使用App&#xff0c;成为了开发者们面临的一大挑战。在这一背景下&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&…

滚珠花键在工业自动化领域中有什么优势?

滚珠花键是工业自动化设备中重要的传动系统之一&#xff0c;不仅在工业自动化系统中有着广泛的运用&#xff0c;还在机械制造领域、航空航天领域、工业汽车领域、工业机器人、高速铁路、新能源领域 等都得到广泛应用。由于具有高精度、高承载、耐磨损、传递扭矩大等特点&#x…

大连瓦房店市科工局副局长乔宽一行调研蓝卓

日前&#xff0c;瓦房店市科技和工业信息化局副局长乔宽、副局长国海军、轴承协会秘书长高钧一行莅临蓝卓调研&#xff0c;学习浙江数字经济发展路径&#xff0c;考察蓝卓数字化服务能力。蓝卓副总经理陈挺、装备汽配军团总监陈伟亮、数字化咨询总监周立斌、大连区域方案经理龚…

昆仑通态触摸屏组态软件MCGS 嵌入版V7.7.1.7老版触摸屏安装程序

1.MCGS7.7嵌入版用于昆仑通态老版本触摸屏组态开发&#xff0c;具体支持哪些型号组态&#xff0c;可以在软件的工程设置里面查看。新出的触摸屏一般用MCGS Pro版本组态开发&#xff0c;老版本触摸屏必须用MCGS 7.7嵌入版组态开发。 2.MCGS7.7嵌入版支持当下常用的Win7、Win10、…

AWS联网和内容分发之Transit Gateway

将Amazon VPC、AWS账户和本地网络连接到一个网关中。AWS Transit Gateway通过中央枢纽连接Amazon虚拟私有云&#xff08;VPC&#xff09;和本地网络。此连接简化了您的网络&#xff0c;并且结束了复杂的对等关系。Transit Gateway充当高度可扩展的云路由器&#xff0c;每个新的…

开发远程遥控情趣玩具软件,提供现成程序源码应具备哪些基础功能

以“东莞梦情智能”为参考&#xff0c;其提供的现成情趣玩具遥控软件程序源码&#xff0c;所具备哪些基础功能&#xff0c;看看它们如何让情趣玩具变得更加丰富多彩。 一、设备连接 设备连接是情趣玩具遥控软件的基础功能之一。“东莞梦情智能”的现成源码支持多种连接方式&am…

10、SpringBoot 源码分析 - 自动配置深度分析三

SpringBoot 源码分析 - 自动配置深度分析三 refresh和自动配置大致流程AutoConfigurationImportSelector的getAutoConfigurationEntry获取自动配置实体(重点)AutoConfigurationImportSelector的getCandidateConfigurations获取EnableAutoConfiguration类型的名字集合AutoConfig…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys锂电叠片机方案:结合CODESYS实现高效生产

锂电叠片机解决方案 乘风破浪&#xff0c;促进新能源行业发展 锂电池是依靠锂离子在正极与负极之间移动来达到充放电目的的一种可充电电池&#xff0c;具有高能量密度、高电压、寿命长、无记忆效应等优点。锂电池属于国家政策扶持的高速发展行业&#xff0c;近年发展快速&…

反射、类加载、代理模式

一、 反射 反射是在程序运行状态下&#xff0c;动态获取类的结构&#xff08;属性&#xff0c;构造器&#xff0c;方法&#xff0c;注解&#xff09;&#xff0c;动态的创建类对象然后调用类中的属性方法。反射的起源Class&#xff0c;Class中包含类反射要使用的API 获取Class的…

java项目——图书管理系统

文章目录 前言图书管理系统整体框架&#xff1a;book包user包Main包&#xff1a;iooperation包总结&#xff1a; 前言 针对这些天所学的javaSE的知识&#xff0c;用一个小项目来实践一下。 图书管理系统 整体框架&#xff1a; 采取面向对象的思想实现此项目&#xff0c;首先…

RedHat9 | DNS剖析-DNS服务器综合部署

一、配置需求及网络拓扑 1、配置拓扑 2、配置需求 使用【主DNS服务器】管理meaauf.cn域和gz.meaauf.cn域&#xff1b;并将bj.meaauf.cn域委派给【子域DNS服务器】进行管理。在【主DNS服务器】上添加相应的A记录、别名记录、MX记录和PTR记录&#xff1a;【辅助DNS服务器】作为…

nginx 安全配置

1、前言 前后端分离后&#xff0c;nginx 作为跨域转发工具在日常应用中越来越广泛&#xff0c;它的安全性不能不能忽略。 2、nginx 安装相关说明 2.1 直接下载安装包 在nginx官网下载编译好的安装包&#xff0c;链接地址为nginx: download。如果是linux系统&#xff0c;直接使…

价格预言机领导者 Pyth 与 Eclipse 平台集成,为高频 DeFi 应用提供支持

本篇文章将对这一战略合作伙伴关系&#xff0c;以及 Pyth 网络在 Eclipse 生态系统中扮演的关键角色进行深入探讨。 目前&#xff0c;Pyth 价格数据已正式上线于 Eclipse 测试网。Eclipse 是首个结合了以太坊安全性、Solana 性能和 Celestia DA 的 Solana虚拟机(SVM) Layer2 方…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接(@arkui-x.bridge)】

平台桥接(arkui-x.bridge) 简介 平台桥接用于客户端&#xff08;ArkUI&#xff09;和平台&#xff08;Android或iOS&#xff09;之间传递消息&#xff0c;即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。 以Android平台为例&#xff0c;Ark…