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

news2024/11/17 9:58:51

题目

思路和解题方法

  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
  • 回溯:在递归返回前,撤销当前位置的占用标记,以便于从当前节点出发探索其他路径。
  • 全面搜索:通过外层循环遍历所有可能的起始点,确保从每个格子出发都尝试寻找解。

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

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

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

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

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

相关文章

Mesa软件框架以及重要数据结构分析

Mesa软件框架以及重要数据结构分析 引言 Mesa的实现比较复杂&#xff0c;其中还有许多的数据结构之间的关系逻辑还不是很清楚。感觉分析了又没有分析一样&#xff0c;这里我们再理一理&#xff01; 1.1 Mesa下EGL/GL核心数据结构和层级关系 MESA的核心数据结构很多很复杂&#…

猜猜我是谁游戏

猜谜过程 在TabControl控件中&#xff0c;第一个tab中放了一个PictureBox&#xff0c;里面有一张黑色的图片。 玩家点击显示答案按钮&#xff0c;切换图片。 设计器 private void button1_Click(object sender, EventArgs e){this.pictureBox1.Image Image.FromFile(&qu…

多模态大模型:系统、趋势与问题

引言 多模态大模型是当今人工智能领域的热门方向之一。它不仅能处理文本&#xff0c;还能理解和生成图像、视频、语音等多种模态的数据。这种能力使得多模态大模型在自然语言处理、计算机视觉等多个领域展示出巨大的潜力和应用价值。那么&#xff0c;多模态大模型是如何训练出…

【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)

【LeetCode刷题】Day 10 题目1&#xff1a;30. 串联所有单词的子串&#xff08;困难&#xff09;思路分析&#xff1a;思路1&#xff1a;滑动窗口哈希map 题目2&#xff1a;LCR 017.最小覆盖子串思路分析思路1&#xff1a;滑动窗口哈希表 题目1&#xff1a;30. 串联所有单词的子…

MyBatis学习笔记(周五前学完)

MyBatis-Plus是一个MyBatis的增强工具。在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 通过MyBatis-Plus来进行数据插入时&#xff0c;它默认会 使用雪花算法来生成id&#xff0c;长度比较长 增删改的返回值都是统一的&#xff0c;影响的只有行数。…

Matplotlib绘图指南:从基础绘图到多子图展示

目录 前言 导入模块 第一点&#xff1a;绘制图像 第二点&#xff1a;保存图像 第三点&#xff1a;多图形的绘制 第四点&#xff1a;绘制多子图 总结 前言 在数据可视化中&#xff0c;Matplotlib是一款强大的Python库&#xff0c;提供了丰富的功能来绘制各种类型的图表。…

Notepad++不显示CRLF的方法

View -> Show Symbol -> 去掉勾选 Show All Characters

[机缘参悟-191] - 《道家-水木然人间清醒1》读书笔记 -14- 关系界限 - 经济和人格上的独立,走向成熟的必经之路,才能更好的谈其他情感(IT)

目录 前言&#xff1a; 1、“友善的孤独者” 2、“外向的孤独者” 3、道不同不相为谋 4、警惕依赖 5、完整独立的个体 6、不必纠正他人的错误&#xff0c;除非他影响了你 7、不再期待别人能理解自己&#xff0c;只有高维向下兼容你的人才能理解你 8、只有高维和同频的…

有限元之有限元法的实现

目录 一、单元刚度矩阵及单元荷载 二、总刚度矩阵及总荷载的合成 三、边界条件处理 四、算例实现 4.1 C代码 4.2 计算结果 五、结论 前三节我们介绍了有限元的基本概念、变分理论及有限元空间的构造&#xff0c;本节我们探讨如何实现有限元法。我们继续以二维椭圆型方程…

5W 1.5KVDC、3KVDC 宽电压输入 DC/DC 电源模块——TP05DA 系列,广泛应用于通信、铁路等设备中

TP05DA系列电源模块额定输出功率为5W&#xff0c;外形尺寸为31.75*20.32*10.65&#xff0c;应用于2:1及4:1电压输入范围 9V-18V、18V-36V、36V-72V、9V-36V和18V-72VDC的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;具有输出短路保护等功能&#xff0c;可广泛应用于…

Apache、Nginx、IIS文件解析漏洞

目录 1、文件解析漏洞介绍 2、Apache相关的解析漏洞 &#xff08;1&#xff09;多后缀解析漏洞 &#xff08;2&#xff09;Apache配置问题 &#xff08;3&#xff09;换行符解析漏洞 &#xff08;4&#xff09;罕见后缀解析 3、Nginx相关的解析漏洞 &#xff08;1&…

刷代码随想录有感(82):贪心算法——摆动序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 1)return nums.size();int prediff 0;int curdiff 0;int res 1;for(int i 0; i < nums.size() - 1; i){curdiff nums[i 1] - nu…

隆道出席河南ClO社区十周年庆典,助推采购和供应链数字化发展

5月26日&#xff0c;“河南ClO社区十周年庆典”活动在郑州举办&#xff0c;北京隆道网络科技有限公司总裁助理姚锐出席本次活动&#xff0c;并发表主题演讲《数字化采购与供应链&#xff1a;隆道的探索与实践》&#xff0c;分享隆道公司在采购和供应链数字化转型方面的研究成果…

Python在忘mysql密码后该如何重新连mysql

步骤一 先到mysql的bin目录下 步骤二 用mysqld delete mysql 把之前的库删了 步骤三 通过管理员模式进去后 用命令mysqld --skip-grant-tables越过验证 再输入mysql -u root 直达账户 步骤四 用FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY new_password; 指…

HTML+CSS TAB导航栏

效果演示 这段代码实现了一个名为"Tab导航栏"的效果,它是一个基于CSS的导航栏,包含五个选项卡,每个选项卡都有一个带有渐变背景色的滑块,当用户点击选项卡时,滑块会滑动到相应的位置。同时,选中的选项卡会变为白色,未选中的选项卡会变为灰色。 Code <!DOC…

《python编程从入门到实践》day41

# 昨日知识点回顾 用户注销、注册&#xff0c;限制访问&#xff0c;新主题关联到当前用户 # 今日知识点学习 第20章 设置应用程序的样式并部署 20.1 设置项目“学习笔记”的样式 20.1.1 应用程序django-bootstrap4 # settings.py ---snip--- INSTALLED_APPS [# 我的应用程序…

【论文阅读|cryoET】DeepETPicker:使用弱监督深度学习的快速准确cryoET三维颗粒挑选算法

题目 DeepETPicker: Fast and accurate 3D particle picking for cryo-electron tomography using weakly supervised deep learning 发表期刊&#xff1a; Nature Communications 发表时间&#xff1a;2024.02 Accepted 作者&#xff1a;Guole Liu, Tongxin Niu 中科院自动化…

基于模糊PID控制器的汽车电磁悬架控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于模糊PID控制器的汽车电磁悬架控制系统simulink建模与仿真。 2.系统仿真结果 上面的仿真结果是无控制器和LQG的对比&#xff0c;以及有控制器和LQG的对比仿真。 3.核心程…

视觉语音识别挑战赛 CNVSRC 2024

CNVSRC 2024由NCMMSC 2024组委会发起&#xff0c;清华大学、北京邮电大学、海天瑞声、语音之家共同主办。竞赛的目标是通过口唇动作来推断发音内容&#xff0c;进一步推动视觉语音识别技术的发展。视觉语音识别&#xff08;也称为读唇技术&#xff09;是一种通过观察唇部动作推…

Cweek2+3

C语言学习 五.操作符 5.单目操作符(2) sizeof不能用于计算动态分配的内存 在对数组使用sizeof时&#xff0c;返回的是整个数组的大小&#xff08;所有元素的总字节数&#xff09;。而对指针使用sizeof时&#xff0c;返回的是指针本身的大小&#xff08;通常是机器字长的大小…