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

深度优先搜索(迷宫寻路)--dfs--模版型的两道题

1.HIGH33 迷宫寻路


importjava.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publicclassMain{// 上下左右四个方向:上、下、左、右staticint[][]dir={{-1,0},{1,0},{0,-1},{0,1}};staticboolean[][]visited;// 标记某个位置是否走过(防止回头死循环)staticchar[][]maze;// 存储迷宫地图staticintn,m;// 迷宫的行数 n,列数 mstaticbooleanreach;// 标记是否能到达终点(true=能到,false=不能)publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);n=sc.nextInt();m=sc.nextInt();sc.nextLine();maze=newchar[n][m];if(n==1&&m==1){System.out.print("Yes");return;}for(inti=0;i<n;i++){maze[i]=sc.nextLine().trim().toCharArray();}visited=newboolean[n][m];// 3. 初始化访问标记数组(全部默认为 false)visited=newboolean[n][m];// 4. 从起点 (0,0) 开始DFS搜索dfs(0,0);// 5. 输出结果:能到终点输出 Yes,否则 NoSystem.out.println(reach?"Yes":"No");}publicstaticvoiddfs(intx,inty){//走出来迷宫,修改值并且返回if(x==n-1&&y==m-1){reach=true;return;}//对于走过的值先标记visited[x][y]=true;//然后开始通过深度优先逐层开始找// // 上下左右四个方向:上、下、左、右//static int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};//遍历上下左右for(int[]d:dir){intnx=x+d[0];intny=y+d[1];//这时候得到了坐标,判断能不能走通// ④ 判断下一步能不能走// 条件:// 1. 不出界// 2. 是空地 .// 3. 没走过if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]=='.'&&!visited[nx][ny]){//如果符合上述条件,继续递归dfs(nx,ny);// ⑥ 已经找到终点了,直接退出,不用再搜if(reach)return;}}}}

2.HIGH34 数水坑


importjava.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publicclassMain{//深度优先的代码// 八连通 (上下左右及四条对角线)意义下互达,则它们属于同一个水坑。staticint[][]dirs={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};staticboolean[][]visited;// 标记某个位置是否走过(防止回头死循环)staticchar[][]grid;// 存储迷宫地图staticintn,m;// 迷宫的行数 n,列数 mpublicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);n=sc.nextInt();m=sc.nextInt();sc.nextLine();grid=newchar[n][m];visited=newboolean[n][m];//录入字符for(inti=0;i<n;i++){grid[i]=sc.nextLine().trim().toCharArray();}intcount=0;//寻找水坑for(inti=0;i<n;i++){for(intj=0;j<m;j++){if(grid[i][j]=='W'&&!visited[i][j]){count++;//找到一个大水坑dfs(i,j);}}}System.out.print(count);}staticvoiddfs(intx,inty){//先改标记位visited[x][y]=true;//遍历方向for(int[]dir:dirs){//加横坐标intnx=x+dir[0];intny=y+dir[1];if(nx>=0&&nx<n&&ny>=0&&ny<m&&grid[nx][ny]=='W'&&!visited[nx][ny]){dfs(nx,ny);}}}}
http://www.jsqmd.com/news/562993/

相关文章:

  • 从脑电波到股票K线:EMD经验模态分解在5个真实场景下的避坑指南
  • 紧急通知:CPython官方GIL豁免白名单已更新!这7个经过PSF安全审计的无锁插件今日起开放安装(附离线安装包获取密钥)
  • AI编程对决:用Claude Code vs 手动开发JWT系统,效率差多少?
  • 【笔试真题】- 阿里系列-2026.03.28-研发岗
  • STM32F103实战:用DAC+DMA+TIM4输出任意波形,附完整代码和示波器实测
  • 从PVT到Crosstalk:深入解析Cell Delay与Net Delay的成因与影响
  • yuzu模拟器优化实战指南:5个步骤解决常见游戏运行问题
  • 数据洞察|全球人口密度分布的技术解析与应用
  • openclaw升级和参数调整
  • Vivado烧写Flash报错‘型号不符’?别只改型号,SPI总线宽度设置才是关键
  • 别再乱装MM系列了!手把手教你用pip搞定MMCV、MMdetection、MMdetection3d的正确安装顺序(附版本对照表)
  • SteamShutdown:智能下载管理与自动化电源控制的创新解决方案
  • 2026自动计量智能称重系统优质厂家推荐指南 - 优质品牌商家
  • 大模型LLM:从基础到进阶,全面掌握自然语言处理的核心技术
  • 精彩回顾|广州工博科技亮相第五届 SAP 全球运营高峰论坛
  • PingFangSC字体优化指南:提升中文排版质量的专业解决方案
  • Qwen3-ASR-1.7B语音识别模型:5分钟快速部署,小白也能搭建离线转写服务
  • 2026年英语学习小程序选择指南:为什么分级阅读成为新趋势
  • C# PictureBox控件实战:从基础配置到动态图像处理
  • Hadoop集群主备切换实战:手动与ZKFC自动切换的保姆级教程
  • OpenClaw轻量办公套件:ollama-QwQ-32B三合一自动化方案
  • 嵌入式Web服务器的轻量级会话管理机制
  • 终极指南:如何让Mac上的第三方鼠标比苹果触控板更好用
  • 保姆级教程:在Ubuntu 20.04上从零搭建ZeroTier私有Planet,突破官方25节点限制
  • 物料自动识别计数系统 (14)采用西门子S7-1200+博图WinCC画面组态,博图V16及以...
  • AlpaSim自动驾驶模拟平台:3大AI驾驶模型配置与部署终极指南
  • Python 网络编程详解:从原理到实践
  • 开源工具G-Helper:华硕笔记本性能优化与硬件调节全指南
  • 7个技巧彻底改变你的Mac菜单栏体验:Ice终极配置指南
  • SpringBoot性能优化:高并发下的Local AI MusicGen服务调优