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

A.每日一题——1970. 你能穿过矩阵的最后一天

题目链接:1970. 你能穿过矩阵的最后一天(困难)

算法原理:

解法:深搜DFS

方法一:反向dfs

13ms击败94.50%

时间复杂度O(mn)

①初始时网格全是水,从最后一天往回推,每天把一个水单元格变成陆地

②检查新恢复的陆地能否从第一行连接到最后一行(上下左右四个方向检查),首次满足时即代表是正向最后一次能走通的路径,其天数即为答案

方法二:正向dfs

5ms击败100.00%

时间复杂度O(mn)

①初始时网格全是陆地,从第一天开始推,每天把一个陆地单元格变成水

②检查水单元格能否从最左列连接到最右列(八个方向检查),首次满足时即代表是所有路径都被封死的时候,其前一天即为答案

③细节:因为题目的day并非封死之后的天数,而是首次封死的触发天,而这一天恰好是最后能过河的天,所以返回的不是day-1

Java代码:

class Solution { //方法一:反向dfs int[] dx=new int[]{0,0,1,-1}; int[] dy=new int[]{1,-1,0,0}; int m,n; public int latestDayToCross(int _m, int _n, int[][] cells) { m=_m;n=_n; //0=水,1=已恢复但未验证连通性的陆地,2=已恢复且有连通性的陆地 byte[][] state=new byte[m][n]; //从最后一天开始逐步恢复陆地 for(int day=cells.length-1;;day--){ //获取第day天被淹没的单元格,正确映射下标 int[] cell=cells[day]; int r=cell[0]-1; int c=cell[1]-1; //将该单元格恢复为陆地,待验证连通性 state[r][c]=1; //核心判断:新恢复的陆地能否连通第一行和最后一行 if(dfsup(r,c,state)&&dfsdown(r,c,state)) return day; } } //判断能否连通第一行 private boolean dfsup(int r,int c,byte[][] state){ //如果当前单元格本身就在第一行,直接返回 if(r==0) return true; //遍历四个方向,看能否连通上 for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; //坐标合法+邻域能连通上 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==2) return true; } return false; } //判断能否连通最后一行 private boolean dfsdown(int r,int c,byte[][] state){ //本身就在最后一行,直接返回 if(r==m-1) return true; //标记当前单元格为能连通的单元格 state[r][c]=2; //遍历四个方向,递归检查连通性 for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; //保证坐标合法+邻域是待验证的陆地 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==1) //如果邻域能连接最后一行,则当前单元格也能 if(dfsdown(x,y,state)) return true; } return false; } }
class Solution { //方法二:正向dfs int[] dx=new int[]{0,0,1,-1,1,1,-1,-1}; int[] dy=new int[]{1,-1,0,0,1,-1,1,-1}; int m,n; public int latestDayToCross(int _m, int _n, int[][] cells) { m=_m;n=_n; //0=陆地,1=未连通的水,2=已连通的水 byte[][] state=new byte[m][n]; //从第一天开始连通水 for(int day=0;;day++){ //获取第day天被淹没的单元格,正确映射下标 int[] cell=cells[day]; int r=cell[0]-1; int c=cell[1]-1; //将该单元格用水淹没,待验证连通性 state[r][c]=1; //核心判断:新水能否连接最左列和最右列 if(dfsleft(r,c,state)&&dfsright(r,c,state)) return day; } } //判断能否连通最左列 private boolean dfsleft(int r,int c,byte[][] state){ //如果当前单元格本身就在最左列,直接返回 if(c==0) return true; //遍历八个方向,看能否连通上 for(int k=0;k<8;k++){ int x=r+dx[k],y=c+dy[k]; //坐标合法+邻域能连通上 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==2) return true; } return false; } //判断能否连通最右列 private boolean dfsright(int r,int c,byte[][] state){ //本身就在最后一行,直接返回 if(c==n-1) return true; //标记当前单元格为能连通的单元格 state[r][c]=2; //遍历八个方向,递归检查连通性 for(int k=0;k<8;k++){ int x=r+dx[k],y=c+dy[k]; //保证坐标合法+邻域是待验证的水 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==1) //如果邻域能连接最右列,则当前单元格也能 if(dfsright(x,y,state)) return true; } return false; } }
http://www.jsqmd.com/news/177880/

相关文章:

  • 8款AI论文写作软件评测:智能降重与高效创作功能对比
  • 数字验证(一):谈谈设计验证的成本
  • 救命神器9个AI论文工具,助你轻松搞定本科生毕业论文!
  • 8款AI论文写作工具性能对比:智能降重与高效创作评测
  • 8款AI论文辅助软件功能测评:智能降重与高效写作能力评估
  • Hadoop vs 数据仓库:大数据存储方案深度对比
  • 还在为AI写论文AIGC率高发愁?8个工具一键生成初稿低至9%!
  • 双层无纺布和薄膜香蕉袋制袋机大品牌
  • 对RSA的小解密指数攻击
  • icon资源
  • 8款AI论文写作工具横向对比:智能降重与高效创作测评
  • 一维数据缝补指南:手把手玩转9种插值姿势
  • QML快速入门
  • 2025年广东省考面试报班全攻略:十大机构排名与深度解析登科七月 - 华Sir1
  • 一键永久关闭windows自动更新,让你再也见不到烦人的自动更新了。永久禁止win10/win11系统自动更新工具
  • C语言随堂笔记-11
  • 基于51单片机的GPS定位系统设计
  • 双层无纺布和薄膜香蕉袋制袋机哪家性价比高
  • 深度解析 CherryECAT:国产 EtherCAT 协议栈与国外主流方案的全方位对比及项目实战(上)
  • 线性参变(LPV)+鲁棒模型预测控制(RMPC)+路径跟踪(PTC),目前能实现20-25m/...
  • 统信UOS操作系统无“网络”选项下连接wifi
  • Rust - 链式调用练习
  • 基于FPGA的图像去雾算法:完整的仿真测试与高质量Matlab代码
  • 互联网大厂Java小白求职面试实录:从Spring到微服务的全面挑战
  • Unity动画混合硬核指南:手写BlendTree代码
  • 8款AI论文写作工具功能对比:智能降重与高效创作能力测评
  • 导师严选2025 AI论文网站TOP9:继续教育必备测评
  • 从Java基础到微服务:小白程序员的求职面试之旅
  • 如何利用大数据预测分析优化供应链管理
  • 智能降重与高效创作:8款AI论文写作工具横向评测