首页 > 其他分享 >2617. 网格图中最少访问的格子数(困难)

2617. 网格图中最少访问的格子数(困难)

时间:2024-04-01 18:22:05浏览次数:20  
标签:2617 格子 iterator int 网格 ceil new col TreeSet

核心思想
比较直观的想法就是BFS,但是每次遍历能走的点(右走,下走)会超时
考虑用两个set数组,
TreeSet<Integer>[] R = new TreeSet[n]; TreeSet<Integer>[] C = new TreeSet[m];
R[i]表示第i行还剩下哪些列col没去过,那么遍历就变为了二分查找第一个比当前j大的col
col > j + grid[i][j]时break
TODO:iterator

public int minimumVisitedCells(int[][] grid) {
        // n 行 m 列
        int n = grid.length, m = grid[0].length;
        //存储步数
        int[][] f = new int[n][m];
        // 使用双重循环来填充二维数组
        for (int i = 0; i < n; i++) {
            Arrays.fill(f[i], -1);
        }
        TreeSet<Integer>[] R =  new TreeSet[n];
        TreeSet<Integer>[] C =  new TreeSet[m];
        for(int i = 0; i < n; i++)
            R[i] = new TreeSet<Integer>();
        for(int j = 0; j < m; j++)
            C[j] = new TreeSet<Integer>();
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(i + j > 0){
                    R[i].add(j);
                    C[j].add(i);
                }
            }
        }
        Queue<int[]> q = new ArrayDeque<>();
        q.offer(new int[]{0, 0});
        f[0][0] = 1;
        while(!q.isEmpty()){
            int[] tp = q.poll();
            int i = tp[0], j = tp[1];
            // 向右走 去R中找
            // 第一个大于j的数
            Integer ceil = R[i].ceiling(j);
            if(ceil != null){
                //最远距离
                int maxiCol = j + grid[i][j];
                Iterator<Integer> iterator = R[i].tailSet(ceil).iterator();
                while(iterator.hasNext()){
                    int col = iterator.next();
                    if (col > maxiCol)
                        break;
                    //记录步数
                    f[i][col] = f[i][j] + 1;
                    //推入队列
                    q.offer(new int[]{i, col});
                    //移出Set
                    iterator.remove();
                    C[col].remove(i);

                }
            }
            // 向下走 去C中
            // 第一个大于i的数
            ceil = C[j].ceiling(i);
            if(ceil != null){
                //最远距离
                int maxiRow = i + grid[i][j];
                Iterator<Integer> iterator = C[j].tailSet(ceil).iterator();
                while(iterator.hasNext()){
                    int row = iterator.next();
                    if(row > maxiRow)
                        break;
                    //记录步数
                    f[row][j] = f[i][j] + 1;
                    //推入队列
                    q.offer(new int[]{row, j});
                    //移出Set
                    iterator.remove();
                    R[row].remove(j);
                }
            }
        }
        return f[n-1][m-1];
    }

标签:2617,格子,iterator,int,网格,ceil,new,col,TreeSet
From: https://www.cnblogs.com/ganyq/p/18109113

相关文章

  • 常见面试算法题-跳格子
    ■ 题目描述【跳格子】地上共有N个格子,你需要跳完地上所有的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,格子间的依赖关系由多组steps数组给出,steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子:比如[0,1]表示从跳完第0个格子以后第1个......
  • 56文章解读与程序——论文可下载-基于微网格形成的弹性配电系统新模型-----已提供下载
    ......
  • 前端学习-UI框架学习-Bootstrap5-003-网格系统
    菜鸟教程链接Bootstrap提供了一套响应式、移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列规则网格每一行需要放在设置了.container(固定宽度)或.container-fluid(全屏宽度)类的容器中,这样就可以自动设置一些外边距与内边距。使......
  • 02-水平垂直网格布局理解
    1.之前使用布局基本都是创建带有UI界面的,并使用ui设计师进行布局,为了更直观理解水平与垂直布局,在miniqt工程基础上,实现水平垂直布局2.垂直布局VBoxLayout1#include<QApplication>2#include<QLabel>34#include<QHBoxLayout>5#include<QVBoxLayout>6#in......
  • 前端学习之css基本网格布局
    网格布局<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>网格布局</title><style>.a{/*grid网格布局*/display:grid;width:......
  • 【机器学习-08】参数调优宝典:网格搜索与贝叶斯搜索等攻略
    超参数是估计器的参数中不能通过学习得到的参数。在scikit-learn中,他们作为参数传递给估计器不同类的构造函数。典型的例子有支持向量分类器的参数C,kernel和gamma,Lasso的参数alpha等。​在超参数集中搜索以获得最佳crossvalidation交叉验证分数的方法是可实现并且推荐的......
  • C105 整体二分+树状数组 P2617 Dynamic Rankings
    视频链接:C105整体二分+树状数组P2617DynamicRankings_哔哩哔哩_bilibili  C96树状数组套权值线段树P2617DynamicRankings-董晓-博客园(cnblogs.com)C104【模板】整体二分+树状数组P3834可持久化线段树2-董晓-博客园(cnblogs.com)LuoguP2617Dynamic......
  • 蓝桥杯——盾神与格子游戏(动态规划+递推)
    资源限制内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述在盾神很小很小还不会怎样编程的时候,他迷上了一款风靡一时的双人游戏!游戏双方在地上画n个格子,然后在最后一格放上一颗石头。每人每轮可以把石头向前移动1到3格,最后谁把......
  • WPF —— Grid网格布局
    1:Grid网格布局简介Grid为WPF中最常用的布局容器,作为View中的主要组成部分,负责框架中整体的页面布局。2:网格标签Grid.ColumnDefGrid.ColumnDefinitions自定义列只能设置宽度不能设置高度ColumnDefinition每一个列可以设置宽度,宽度可以是一个具体值也可以设置*的意......
  • fabricjs怎么添加网格线
    html文件:1<canvasid="c"width="600"height="400"></canvas>css文件:1canvas{2border:1pxsolidlightgrey;3} javascript文件1varcanvas=newfabric.Canvas('c',{2selection:false3});4v......