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

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

时间:2023-09-11 11:22:24浏览次数:45  
标签:格子 int 2850 网格 石头 grid ans path 362

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

给你一个大小为 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

解题思路

见代码注释

code

typedef pair<int,int> PII;

class Solution {
public:
    //数据范围并不算大
    //暴力解
    //移入和移出是一一对应的
    //from : (0,1) (0,1) (2,2) (2,2)
    //to : (0,2) (1,1) (1,2) (2,1)
    //找到from 的全排列

    void dfs(vector<PII> & from,vector<PII> & to,vector<PII> & path,vector<int> & visited,int & ans)
    {
        if(path.size() == from.size())
        {
            int dist = 0;
            for(int i = 0;i < from.size();i++) dist += abs(to[i].first - path[i].first) + abs(to[i].second - path[i].second);
            ans = min(ans,dist);
        }

        for(int i = 0;i < from.size();i ++)
        {
            if(!visited[i])
            {
                path.push_back(from[i]);
                visited[i] = 1;
                dfs(from,to,path,visited,ans);
                path.pop_back();
                visited[i] = 0;
            }
        }
    }

    int minimumMoves(vector<vector<int>>& grid) {

        vector<PII> from;
        vector<PII> to;

        for(int i = 0;i < 3;i ++)
            for(int j = 0;j < 3;j ++)
                if(grid[i][j] == 0)
                    to.push_back({i,j});
                else
                    while(grid[i][j]-- > 1)
                        from.push_back({i,j});
        
        int ans = 0x3f3f3f3f;
        
        vector<PII> path;
        vector<int> visited(from.size(),0);

        dfs(from,to,path,visited,ans);
        
        return ans;
    }
};
class Solution:
    def minimumMoves(self, grid: List[List[int]]) -> int:
        from_ = []
        to_ = []
        
        for i,row in enumerate(grid):
            for j,cnt in enumerate(row):
                if(cnt > 1):
                    from_.extend([(i,j)] * (cnt - 1))
                elif(cnt == 0):
                    to_.append((i,j))

        ans = inf

        for from2 in permutations(from_):
            total = 0

            for (x1,y1),(x2,y2) in zip(from2,to_):
                total += abs(x1 - x2) + abs(y1 - y2)

            ans = min(ans,total)
        
        return ans

标签:格子,int,2850,网格,石头,grid,ans,path,362
From: https://www.cnblogs.com/huangxk23/p/17693038.html

相关文章

  • 2848.与车相交的点-362
    2848.与车相交的点给你一个下标从0开始的二维整数数组nums表示汽车停放在数轴上的坐标。对于任意下标i,nums[i]=[starti,endi],其中starti是第i辆车的起点,endi是第i辆车的终点。返回数轴上被车任意部分覆盖的整数点的数目。示例1:输入:nums=[[3,6],[1,5],[4......
  • 2849. 判断能否在给定时间到达单元格-362
    2849.判断能否在给定时间到达单元格给你四个整数sx、sy、fx、fy以及一个非负整数t。在一个无限的二维网格中,你从单元格(sx,sy)开始出发。每一秒,你必须移动到任一与之前所处单元格相邻的单元格中。如果你能在恰好t秒后到达单元格(fx,fy),返回true;否则,返回......
  • LeetCode/将石头分散到网格的最少移动次数
    给你一个大小为3*3,下标从0开始的二维整数矩阵grid,分别表示每一个格子里石头的数目。网格图中总共恰好有9个石头,一个格子里可能会有多个石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。请你返回每个格子恰好有一个石头的......
  • 网格化下的服务熔断
    (文章目录)网格化下的服务熔断前言随着云计算、容器化、微服务等技术的发展,现代应用已经变得越来越复杂。这些技术给开发者带来了更多选择,并提供了更大的可扩展性和灵活性。然而,这些技术的使用也带来了新的挑战,如容器编排、服务发现、服务治理、服务熔断等方面的问题需要解决。......
  • 【HarmonyOS】一文教你如何使用低代码平台网格布局动态加载数据
    【关键字】低代码平台、AGC、API6、网格布局、数据模型 【写在前面】正式开工之前,先来说一下今天要实现的内容,今天会实现一个网格布局的展示,我会创建一个数据模型,然后网格列表的数据从数据模型中获取,从而实现一个动态展示的效果。在实现之前,先来简单说一下什么是数据模型?在......
  • VisualSFM的配置与使用 & MeshLab的网格生成与纹理添加
    VisualSFM的配置与使用&MeshLab的网格生成与纹理添加翻译搜索复制......
  • loj3362
    因为某hhz曾经往XJOI模拟赛搬了这题,然后现在我要给模拟赛讲题,所以滚回来补题了。观察\(1\):对于一个形如WWBB的子图,如果当前匹配是\((1,4)(2,3)\),我们换成\((1,3)(2,4)\)总更优。观察\(2\):满足观察\(1\)的情况,可以被描述为,假设某个B和W相连,那么当前B的后一个......
  • VNPY-网格交易(策略交易)
    ##grid_trade_strategy.pyfromvnpy_ctastrategyimport(CtaTemplate,StopOrder,TickData,BarData,TradeData,OrderData,BarGenerator,ArrayManager,)fromvnpy.trader.constantimportOrderType,Offset,DirectionclassGr......
  • Matplotlib 网格线
    Matplotlib网格线我们可以使用pyplot中的grid()方法来设置图表中的网格线。grid()方法语法格式如下:matplotlib.pyplot.grid(b=None,which='major',axis='both',)b:可选,默认为None,可以设置布尔值,true为显示网格线,false为不显示,如果设置**kwargs参数,则值为true。which:......
  • 网格布局管理器
    AWT布局管理器有五种:流布局管理器(FlowLayout)、网格布局管理器(GridLayout)、边界布局管理器(BorderLayout)、卡片布局管理器(CradLayout)、网格包布局管理器(GridBagLayout)参考:https://www.cnblogs.com/wzy330782/p/5427968.html......