蓝桥杯第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:returnif st[x][y] == 1:returnif len == 15:global resres += 1returnst[x][y] = 1for i in range(4):dfs(x + dx[i], y + dy[i], len + 1)st[x][y] = 0dx, dy = [-1, 0, 1, 0], [0, -1, 0, 1]
st = [[0]*4 for _ in range(4)]
res = 0for 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
  • 回溯:在递归返回前,撤销当前位置的占用标记,以便于从当前节点出发探索其他路径。
  • 全面搜索:通过外层循环遍历所有可能的起始点,确保从每个格子出发都尝试寻找解。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爷爷看了都会,打工人必备的摸鱼AI神器!免费!

去年&#xff0c;AI技术无疑成为了最为引人注目的焦点&#xff0c;层出不穷的创新应用令人目不暇接。尽管许多人对这股AI热潮的持久性持怀疑态度&#xff0c;但现实却用事实给予了最有力的反驳。AI所展现出的强大生产力&#xff0c;足以令人刮目相看。 而今年以来&#xff0c;…

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地&#xff0c; 我刚开始用的nodejs14报错&#xff0c; 后面换成nodejs16&#xff0c;启动前端成功了。 页面如下图所示

【JPCS出版,EI稳定检索会议推荐】第四届计算机、遥感与航空航天国际学术会议(CRSA 2024)已成功申请JPCS出版,火热征稿中!

【EI核心、Scopus】第四届计算机、遥感与航空航天国际学术会议&#xff08;CRSA 2024&#xff09;将于2024年7月5-7日在日本大阪举行。计算机、遥感与航空航天国际学术会议为来自世界各地的研究学者、工程师、学会会员以及相关领域的专家们提供一个关于“计算机科学”、“遥感技…

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA&#xff1a;革新电子设计&#xff0c;让高效与便捷触手可及 在快节奏的现代生活中&#xff0c;科技日新月异&#xff0c;各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言&#xff0c;SmartEDA的出现&#xff0c;无疑是一场革命性的变革。它以其高效…

【PG16】后 EL 7 时代,PG 16 如何在 CentOS 7 上运行

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ ★ 本文写于 2023-09-29 PostgreSQL 16 Released 9/14, PostgreSQL 16 正式发布。从发布公告^1 和 Release Notes^2 可以看到 PG16 包含了诸多新特性和增强改进。 性能提升&#xff0c;查询计划…

Genzai:一款针对物联网安全的多功能实用性工具套件

关于Genzai Genzai是一款针对物联网安全的多功能实用性工具套件&#xff0c;该工具旨在识别与物联网相关的仪表盘&#xff0c;并扫描它们以查找默认密码和安全问题&#xff0c;广大研究人员可以使用该工具来检测和提升物联网设备的安全性。 Genzai支持用户以输入的形式提供一个…

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做&#xff1f;《简爱》作为夏洛蒂勃朗特的代表作&#xff0c;不仅是一部经典的爱情小说&#xff0c;也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品&#xff0c;制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

探讨开源与闭源大模型在AI领域的发展前景与挑战

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;大模型已成为推动AI技术进步的核心动力。在AI大模型的发展过程中&#xff0c;开源与闭源两种不同的发展路径各自展现出了独特的发展前景与挑战。本文将深入探讨这两种路径在AI领域的发展前景&#…

在马达驱动上的MOS产品选型分析与应用

电机的应用非常广泛&#xff0c;可以说大部分动的产品内部都有电机的身影&#xff0c;其主要的应用领域有风机、泵、散热风扇、电动工具、智能家居、以及汽车应用等等。随着各国出台了更加严格的用电标准&#xff0c;节能电机成为了市场关注的热点&#xff0c;而BLDC电机具有高…

K8S集群中Yaml文件详解

目录 一、Yaml概述 二、Yaml基本语法 三、Yaml数据结构 四、K8S资源清单描述方法 五、api资源版本标签 六、Yaml文件示例详解 1.deployment.yaml文件详解 2.Pod yaml文件详解 3.Service yaml文件详解 七、Yaml文件相关操作 1.试运行 2.生成yaml格式 3.生成json格式…

手搓顺序表(C语言)

目录 SeqList.h SeqList.c 头插尾插复用任意位置插入 头删尾删复用任意位置删除 SLtest.c 测试示例 顺序表优劣分析 SeqList.h //SeqList.h#pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h> #define IN_CY 3typedef int S…

深入分析C#中的“编写器”概念——代码修改、注解与重构

文章目录 1. 编写器&#xff08;Writer&#xff09;的概念2. 编写器的作用和工作原理3. 编写器的重要性4. 写入器常用方法5. 写入器示例6. 编写器示例——使用Fody进行代码注解和重构7. 总结 在软件开发过程中&#xff0c;代码的维护和更新是至关重要的。C#作为一种流行的编程语…

3.00001 postgres如何初始化系统参数?

文章目录 加载参数整体流程参数结构举例&#xff1a;ConfigureNamesBool 初始化参数 InitializeGUCOptionsbuild_guc_variablesInitializeOneGUCOptionInitializeGUCOptionsFromEnvironment 命令行添加SelectConfigFiles配置 加载参数整体流程 我们先看下guc参数是如何管理的。…

VUE3 学习笔记(6):data数据的监听、表单绑定、操作DOM

data数据的监听&#xff08;侦听&#xff09; 对于data的值的监听&#xff0c;可以用watch中与data中的参数命名一致的值做为函数进行获取监听变动前后的值再做逻辑判断&#xff0c;如下图所示。 示例代码 <template><div><p :class"classDemo">{…

七大获取免费https的方式

想要实现https访问最简单有效的的方法就是安装SSL证书。只要证书正常安装上以后&#xff0c;浏览器就不会出现网站不安全提示或者访问被拦截的情况。下面我来教大家怎么去获取免费的SSL证书&#xff0c;又如何安装证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提…

C#数据类型变量、常量

一个变量只不过是一个供程序操作的存储区的名字。 在 C# 中&#xff0c;变量是用于存储和表示数据的标识符&#xff0c;在声明变量时&#xff0c;您需要指定变量的类型&#xff0c;并且可以选择性地为其分配一个初始值。 在 C# 中&#xff0c;每个变量都有一个特定的类型&…

windows驱动开发-PCI讨论(二)

认识PCI设备&#xff0c;还是要从配置空间说起&#xff0c;当PCI在ACPI和PCI复合体上电和枚举完成后&#xff0c;PCI根复合体会从PCI设备读出PCI设备的配置空间&#xff0c;许多信息(例如寄存器、内存空间、中断信息等等)都是是从配置空间获取的&#xff0c;所以接下来会详细讲…

动手学操作系统(三、通过IO接口直接控制显卡)

动手学操作系统&#xff08;三、通过IO接口直接控制显卡&#xff09; 在之前的学习内容中&#xff0c;我们成功编写了MBR主引导记录&#xff0c;在终端上进行了打印显示&#xff0c;在这一节我们使用MBR通过IO接口来直接控制显卡输出字符。 文章目录 动手学操作系统&#xff0…

逻辑回归(头歌)

第1关&#xff1a;逻辑回归算法大体思想 #encodingutf8import numpy as np#sigmoid函数 def sigmoid(t):#输入&#xff1a;负无穷到正无穷的实数#输出&#xff1a;转换后的概率值#********** Begin **********#result 1.0 / (1 np.exp(-t))#********** End **********#retur…

43、Flink 的 Window Join 详解

1.Window Join a&#xff09;概述 Window join 作用在两个流中有相同 key 且处于相同窗口的元素上&#xff0c;窗口可以通过 window assigner 定义&#xff0c;并且两个流中的元素都会被用于计算窗口的结果。 两个流中的元素在组合之后&#xff0c;会被传递给用户定义的 Joi…