首页 > 其他分享 >2850. 将石头分散到网格图的最少移动次数 Medium

2850. 将石头分散到网格图的最少移动次数 Medium

时间:2024-07-20 19:29:29浏览次数:11  
标签:stones Medium 格子 一个 2850 网格 石头 grid 移动

给你一个大小为 3 * 3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头,一个格子里可能会有 多个 石头。

每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。

请你返回每个格子恰好有一个石头的 最少移动次数 。

示例 1:

输入:grid = [[1,1,0],[1,1,1],[1,2,1]]
输出:3
解释:让每个格子都有一个石头的一个操作序列为:
1 - 将一个石头从格子 (2,1) 移动到 (2,2) 。
2 - 将一个石头从格子 (2,2) 移动到 (1,2) 。
3 - 将一个石头从格子 (1,2) 移动到 (0,2) 。
总共需要 3 次操作让每个格子都有一个石头。
让每个格子都有一个石头的最少操作次数为 3 。

示例 2:

输入:grid = [[1,3,0],[1,0,0],[1,0,3]]
输出:4
解释:让每个格子都有一个石头的一个操作序列为:
1 - 将一个石头从格子 (0,1) 移动到 (0,2) 。
2 - 将一个石头从格子 (0,1) 移动到 (1,1) 。
3 - 将一个石头从格子 (2,2) 移动到 (1,2) 。
4 - 将一个石头从格子 (2,2) 移动到 (2,1) 。
总共需要 4 次操作让每个格子都有一个石头。
让每个格子都有一个石头的最少操作次数为 4 。

提示:

 ·grid.length == grid[i].length == 3

 ·0 <= grid[i][j] <= 9

 ·grid 中元素之和为 9 。

题目大意:计算将每个格子中多出的石头填满所有空白格子所需的最少移动次数。

分析:

(1)可以用数组stones保存所有多出的石头的位置,用数组empty保存所有空白格子的位置,由于多出的石头刚好能够填满空白格子,所以数组stones和数组empty的大小相同;

(2)由(1)可知题目可转化为每次从stones和empty中各取出一个位置,然后将移动次数step加上这两个位置间的距离,重复上述操作直至两个数组为空,计算step可得的最小值;

(3)根据(2)设计算法,枚举stones的所有排列,对于每个排列在遍历的过程中将step加上stones[i]和empty[i]的距离,所有排列中step的最小值即为所得的最少移动次数。

class Solution {
public:
    int minimumMoves(vector<vector<int>>& grid) {
        int ans=INT_MAX,num;
        vector<pair<int,int>> stones,empty;
        for(int i=0;i<3;++i){
            for(int j=0;j<3;++j){
                num=grid[i][j];
                if(num>1) for(int k=1;k<num;++k) stones.emplace_back(i,j);
                else if(!num) empty.emplace_back(i,j);
            }
        }
        int N=stones.size();
        while(1){
            num=0;
            for(int i=0;i<N;++i){
                num+=abs(stones[i].first-empty[i].first)+
                     abs(stones[i].second-empty[i].second);
            }
            ans=min(ans,num);
            if(!next_permutation(stones.begin(),stones.end())) break;
        }
        return ans;
    }
};

标签:stones,Medium,格子,一个,2850,网格,石头,grid,移动
From: https://blog.csdn.net/m0_60444839/article/details/140575796

相关文章

  • ThreeJS Shader的效果样例网格平面和网格球体(一)
    本文中效果主要采用ThreeJS 中的着色器(Shader)以及结合ShaderMaterial实现的。主要用到的内置方法有:step:是一个阶跃函数,它将一个浮点数与一个阈值进行比较,并返回一个阶跃值;比如step(edge,x), 如果x小于等于edge,则返回0.0, 如果x大于edge,则返回1.0。fract......
  • 算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、O
    ​大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」今日215/10000抱个拳,送个礼为模型找到最好的超参数是机器学习实践中最困难的部分之一1.超参数调优的基本概念机器学习模型中的参数通常分为两类:模型参数和超......
  • UE Spline 样条网格体组件添加碰撞
    最近做的一个功能是通过Spline生成管道模型。如下图所示:遇到的一个问题是需要给生成的管路加上碰撞。其中需要两个重要的步骤:设置SplineMeshComponent的碰撞预设找到“样条网格体组件”节点,点击节点,出现详情面板,在详情面板中,把碰撞预设从默认的“NoCollision”改成“B......
  • 使用 Vue 和 Plotly.js 创建交互式 3D 网格图
    本文由ScriptEcho平台提供技术支持项目地址:传送门使用Vue和Plotly.js创建交互式3D网格图应用场景介绍3D网格图是一种强大的可视化工具,可用于表示具有三个维度的数据。它们广泛应用于科学、工程和医学等领域,用于显示复杂数据并揭示潜在模式。代码基本功能介绍......
  • HTML5+CSS3小实例:响应式漫画网格布局
    实例:响应式漫画网格布局技术栈:HTML+CSS效果:源码:【HTML】<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......
  • 服务网格新篇章:Eureka与分布式服务网格的协同共舞
    服务网格新篇章:Eureka与分布式服务网格的协同共舞引言在微服务架构的浪潮中,服务网格(ServiceMesh)技术以其微服务间通信的精细化控制而备受瞩目。Eureka作为Netflix开源的服务发现框架,虽然本身不直接提供服务网格功能,但可以与服务网格技术如Istio、Linkerd等无缝集成,实现服......
  • CSS Grid 网格布局边框设置
    Grid网格布局是一种比较新的布局方法,几乎能实现所有设计的布局,比Flex布局更强大.但是最近将它用于画表格时碰到了一点问题,就是关于边框.需求是将所有边都加上等粗的边框,同时内容最好能进行水平和垂直的居中.碰到的问题:1.使用cssborder,可能会造成边框的重叠这个能搜到......
  • Exact Neighbours (Medium)
    官解的方法二就是这篇博客(注意要先将\(a\)从小到大排序),补充一下,博客中说当\(a_j-j+1<0\)时,我们就找第\(j-a_j\)列的那个房子即可我在做的时候,也想到了逐个构造的方法,然而我在构造新的一列时,却总是想让这一列的房子与前一列的房子来配对,事实证明,我们构造的时候不要拘泥于数学归纳......
  • Mike21查看网格数量及节点数量的三种方法
    Mike21查看网格数量及节点数量的三种方法`提示:如何查看Mike21查看网格数量及节点数量**前言:**很多新手群友不管是用MIKE自带的网格剖分还是SMS剖分的网格都会遇到个问题,那就是生成mesh后不知道怎么查看网格数量及节点数量。下面由小编拉给大家介绍三种简单的方法吧方法......
  • 【Python机器学习】模型评估与改进——带交叉验证的网格搜索
    虽然将数据划分为训练集、验证集、测试集的方法是可行的,也相对常用,但这种方法对数据的划分相当敏感,为了得到对泛化性能的更好估计,我们可以使用交叉验证来评估每种参数组合的性能,而不是仅将数据单次划分为训练集与验证集。代码表示如下:fromsklearn.svmimportSVCfromsklear......