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

embedded/2024/10/18 12:27:23/

题目

思路和解题方法

  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 版本(仅供参考)

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.ppmy.cn/embedded/43724.html

相关文章

基于深度学习的 CT 重建核的图像转换改进了肺部结节或肿块的放射组学再现性 | 文献速递-深度学习结合影像组学

Title 题目 Deep Learning–based Image Conversion of CT Reconstruction Kernels Improves Radiomics Reproducibility for Pulmonary Nodules or Masses 基于深度学习的 CT 重建核的图像转换改进了肺部结节或肿块的放射组学再现性 Background 背景 Intratumor hetero…

synopsys EDA 2016 合集 下载

包含如下安装包&#xff0c;如需安装服务也可联系我 FineSim_vL_2016.03 Laker201612 Library Compiler M-2016.12 Update Training PrimeTime M-2016.12 Update Training StarRC M-2016.12 Update Training SynopsysInstaller_v3.3 TSMC-65nm(OA) fm_vL-2016.03-SP1 fpga_vL-…

【MySQL】SQL 基础

文章目录 【 1. SQL 的书写规则 】1.1 大小写规则1.2 常量的表示1.3 注释1.4 HELP 系统帮助 【 2. 常用数据库函数 】2.1 SHOW DATABASES 显示数据库2.2 CREATE DATABASE 创建数据库2.3 ALTER DATABASE 修改数据库2.4 DROP DATABASE 删除数据库2.5 USE 选择数据库 【 3. RDBMS …

Qt第八章绘图

第八章绘图 文章目录 第八章绘图基本绘制和填充绘制图形使用画笔QPen使用画刷QBrush样式&#xff0c;颜色&#xff0c;纹理填充渐变填充 坐标变换绘图函数QImage是为I/O和直接像素访问和操作而设计优化的QPixmap是为在屏幕上显示图像而设计优化的QBitmap只是一个继承了QPixmap的…

代码随想录算法训练营Day7|454.四数相加II、 383. 赎金信、15. 三数之和、 18. 四数之和

454.四数相加II 四个数组分成两组进行for循环&#xff0c;先用HashMap存储所有第一组for循环出现的和的次数。再进行第二组for循环&#xff0c;每一次得出的和判断其负数是否在map的key中&#xff0c;如果存在&#xff0c;就加上这个value。 class Solution {public int four…

滑动窗口-java

主要通过单调队列来解决滑动窗口问题&#xff0c;得到滑动窗口中元素的最大值和最小值。 目录 前言 一、滑动窗口 二、算法思路 1.滑动窗口 2.算法思路 3.代码详解 三、代码如下 1.代码如下 2.读入数据 3.代码运行结果 总结 前言 主要通过单调队列来解决滑动窗口问题&#xff…

Scala学习笔记6: 类

目录 第六章 类1- 简单类和无参方法2- 带有getter和setter的属性3- 只带getter的属性4- 对象私有化5- 辅助构造器6- 主构造器7- 嵌套类end 第六章 类 在Scala中, 类用于创建对象的蓝图; 类可以包含方法、值、变量、类型、对象和特质等成员; 类名应该以大写字母开头, 可以包含…

英语四级翻译练习笔记③——大学英语四级考试2023年12月真题(第三套)

目录 引言&#xff08;必看&#xff09; 四级翻译评分标准分析及真题解析 四级翻译评分标准 四级翻译真题 学生作答 1. 评分 2. 修正翻译中的错误 错误标记&#xff1a; 3. 改正句子 4. 标出错误单词 5. 标准答案 6. 常考万能句子 7.重点单词的中文意思 引言&…