解决leetcode第3426题所有安放棋子方案的曼哈顿距离

news2025/1/21 7:50:05

3426.所有安放棋子方案的曼哈顿距离

难度:困难

问题描述:

给你三个整数m,n和k。

给你一个大小为mxn的矩形格子,它包含k个没有差别的棋子。请你返回所有放置棋子的合法方案中,每对棋子之间的曼哈顿距离之和。

一个合法方案指的是将所有k个棋子都放在格子中且一个格子里至多只有一个棋子。

由于答案可能很大,请你将它对109+7取余后返回。

两个格子(xi,yi)和(xj,yj)的曼哈顿距离定义为|xi-xj|+|yi-yj|。

示例1:

输入:m=2,n=2,k=2

输出:8

解释:

放置棋子的合法方案包括:

前4个方案中,两个棋子的曼哈顿距离都为1。

后2个方案中,两个棋子的曼哈顿距离都为2。

所以所有方案的总曼哈顿距离之和为1+1+1+1+2+2=8。

示例2:

输入:m=1,n=4,k=3

输出:20

解释:

放置棋子的合法方案包括:

第一个和最后一个方案的曼哈顿距离分别为1+1+2=4。

中间两种方案的曼哈顿距离分别为1+2+3=6。

所以所有方案的总曼哈顿距离之和为4+6+6+4=20。

提示:

1<=m,n<=105

2<=m*n<=105

2<=k<=m*n

问题分析:

这个问题的难度系数比较高,leetcode的问题得分在6分以上即为困难,而完成这个题可以得8分。

追求本心,自然处理,符合人们解决问题的思考逻辑,这个题也是这样来考虑的,而且也确实解决了问题。

首先要解决的是,在一个mXn矩阵中的所有位置放置k个棋子,共有多少种不同的放置法,这又是一个排列组合问题。函数get_all(n,k)解决了这个问题,其的n表示矩阵中的n个位置,k表示放置k个棋子,用字符1表示有棋子,0表示没有棋子,通过递归处理将不同的放置方案求出,返回不同排列的放置方案列表。

其次是将这些不同排列放置方案中的一个进行解析,将放置了棋子的位置转换为mXn矩阵中的坐标并形成坐标列表返回,没有放置棋子的则不予处理。函数get_one_point_grid(m,n,c)解决了这个问题,其中m、n表示矩阵有m行n列,c为上一步求出的放置方案列表中的一个方案。

第三步则将所有的放置方案列表中的方案转化成坐标列表的形式并返回,函数get_all_grid(m,n,k)实现了这一要求,返回的列表中的每一个元素还是一个列表,对应一种放置方案解析出的放置了棋子的坐标序列。

此外还有如何计算两个坐标的曼哈顿值,函数get_distance(point1,point2)解决了这一问题。

计算一种放置方案的曼哈顿值之和用函数get_one_mhd(point_arr)解决。

最后是计算所有放置方案的曼哈顿值之和,函数get_all_mhd(b)解决了这个问题。其返回值即是这个问题的求解。

程序如下:

#将一个字符0插入到k个元素中形成的全排列
def get_in(ak):
    n=len(ak)
    e = []
    for i in range(n+1):
        b='0'
        a=ak[0:i]
        c=ak[i:]
        d=a+b+c
        e.append(d)
    return e

#生成n个位置有k个棋子的各种排列,其中n=行X列,用1表示放置了棋子,0表示未放置棋子
def get_all(n,k):
    if n==k:
        return ['1'*k]
    elif n==k+1:
        return get_in('1'*k)
    else:
        c=[]
        for i in get_all(n-1,k):
            c.extend(get_in(i))
        return list(set(c))

#将放置方案列表中的一个方案解析为mXn矩阵中的坐标,并返回坐标列表
def get_one_point_grid(m,n,c):
    a=[]
    count=0
    for i in range(m): #i表示行数
        for j in range(n): #j表示列数
            #如果字符串中该字符为1,提取该位置坐标,并加入到a列表中
            if c[count]=='1':
                a.append([i,j])
            count=count+1
    return a

#将放置方案列表中的所有方案解析为矩阵坐标列表并以更大的列表返回
def get_all_gird(m,n,k):
    a = get_all(m * n, k)
    print('以字符形式形成的方案:',a)
    b = []
    for i in a:
        b.append(get_one_point_grid(m, n, i))
    print('字符串方案转换为坐标列表方案:',b)
    return b

#计算两个格子的曼哈顿距离
def get_distance(point1,point2):
    x1=point1[0]
    y1=point1[1]
    x2=point2[0]
    y2=point2[1]
    return abs(x1-x2)+abs(y1-y2)

#计算以坐标列表形成的方案列表中的一种方案的曙哈顿距离之和
def get_one_mhd(point_arr):
    s=0
    n=len(point_arr)
    for i in range(n-1):
        for j in range(i+1,n):
            point1=point_arr[i]
            point2=point_arr[j]
            s=s+get_distance(point1,point2)
    print(f'正在处理坐标方案{point_arr},曼哈顿距离之和为{s}')
    return s

#计算所有坐标列表方案的曼哈顿距离之知
def get_all_mhd(b):
    s=0
    for i in b:
        s=s+get_one_mhd(i)
    return s

#主程序
m,n,k=eval(input('pls input m,n,k='))
b=(get_all_gird(m,n,k))
print('所有方案的总曼哈顿距离之和为:',get_all_mhd(b))

运行实例一

pls input m,n,k=1,4,3

以字符形式形成的方案: ['0111', '1011', '1101', '1110']

字符串方案转换为坐标列表方案: [[[0, 1], [0, 2], [0, 3]], [[0, 0], [0, 2], [0, 3]], [[0, 0], [0, 1], [0, 3]], [[0, 0], [0, 1], [0, 2]]]

正在处理坐标方案[[0, 1], [0, 2], [0, 3]],曼哈顿距离之和为4

正在处理坐标方案[[0, 0], [0, 2], [0, 3]],曼哈顿距离之和为6

正在处理坐标方案[[0, 0], [0, 1], [0, 3]],曼哈顿距离之和为6

正在处理坐标方案[[0, 0], [0, 1], [0, 2]],曼哈顿距离之和为4

所有方案的总曼哈顿距离之和为: 20

运行实例二

pls input m,n,k=2,2,2

以字符形式形成的方案: ['0101', '1010', '0110', '1001', '1100', '0011']

字符串方案转换为坐标列表方案: [[[0, 1], [1, 1]], [[0, 0], [1, 0]], [[0, 1], [1, 0]], [[0, 0], [1, 1]], [[0, 0], [0, 1]], [[1, 0], [1, 1]]]

正在处理坐标方案[[0, 1], [1, 1]],曼哈顿距离之和为1

正在处理坐标方案[[0, 0], [1, 0]],曼哈顿距离之和为1

正在处理坐标方案[[0, 1], [1, 0]],曼哈顿距离之和为2

正在处理坐标方案[[0, 0], [1, 1]],曼哈顿距离之和为2

正在处理坐标方案[[0, 0], [0, 1]],曼哈顿距离之和为1

正在处理坐标方案[[1, 0], [1, 1]],曼哈顿距离之和为1

所有方案的总曼哈顿距离之和为: 8

运行实例三

pls input m,n,k=1,4,4

以字符形式形成的方案: ['1111']

字符串方案转换为坐标列表方案: [[[0, 0], [0, 1], [0, 2], [0, 3]]]

正在处理坐标方案[[0, 0], [0, 1], [0, 2], [0, 3]],曼哈顿距离之和为10

所有方案的总曼哈顿距离之和为: 10

运行实例四

pls input m,n,k=5,1,5

以字符形式形成的方案: ['11111']

字符串方案转换为坐标列表方案: [[[0, 0], [1, 0], [2, 0], [3, 0], [4, 0]]]

正在处理坐标方案[[0, 0], [1, 0], [2, 0], [3, 0], [4, 0]],曼哈顿距离之和为20

所有方案的总曼哈顿距离之和为: 20

感悟:

将大问题分解为小问题,将数据处理成自己想要的形式,构建数据为解决问题服务,问题的解决将变得有迹可循,富于条理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「免填邀请码」赋能各类APP,提升转化率与用户体验

在当前移动互联网的高速发展下&#xff0c;用户获取和留存已成为各类APP成功的关键。传统的注册流程虽然能够有效识别用户来源并进行用户管理&#xff0c;但随着市场竞争的激烈&#xff0c;复杂的注册和绑定步骤往往会成为用户流失的瓶颈。免填邀请码技术&#xff0c;结合自研的…

Linux:expect spawn简介与用法

一、背景 大家在使用linux系统的很多时候&#xff0c;都用linux指令来实现一些操作&#xff0c;执行特定的job&#xff0c;有时一些场景中需要执行交互指令来完成任务&#xff0c;比如ssh登录这个命令大家一定很熟悉&#xff1a; ssh-keygen -t rsa # 以及 ssh-copy-id -i /hom…

Express的接口

目录 接口的跨域问题域问题 request接口代码 const express require(express) const app express() //在路由之前&#xff0c;配置cors中间件&#xff0c;解决接口跨域问题 const cors require(cors) app.use(cors())const router require(./apiRouter)app.use(/api,rout…

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

文章目录 OverviewPCIe VDM (Vendor Defined Messages) 概述PCIe VDM Header 的各个字段及作用VDM 的工作方式例子:一个简化的 VDM 示例注意事项Overview 本文将详细介绍 PCIe VDM 及 PCIe VDM Header 各个域的作用。 PCIe VDM (Vendor Defined Messages) 概述 在 PCIe 协议…

微服务学习:基础理论

一、微服务和应用现代化 1、时代的浪潮&#xff0c;企业的机遇和挑战 在互联网化数字化智能化全球化的当今社会&#xff0c;IT行业也面临新的挑战&#xff1a; 【快】业务需求如“滔滔江水连绵不绝”&#xff0c;企业需要更快的交付【变】林子大了&#xff0c;百色用户&…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

【PCIe 总线及设备入门学习专栏 6 -- PCIe Inbound and Outbound】

文章目录 PCIe Outbound 和 Inbound 概念详解Outbound 与 Inbound 的基础定义基于角色的详细分析关于“上游”和“下游”方向应用举例小结PCIe Outbound 和 Inbound 概念详解 PCIe(Peripheral Component Interconnect Express)是一种高速串行通信协议,用于连接主机与外部设…

24年总结 -- 共赴心中所向往的未来

一、前言 我又回来了&#xff0c;前阵子忙着期末考试的东西&#xff0c;也是快半个月没更新了&#xff0c;刚好前几天报名了博客之星的评选&#xff0c;也很幸运的入围了&#xff0c;也借此机会来回顾一下关于2024年的个人成长、创作经历等。 二、个人 本人是一个双非学校的软…

嵌入式产品级-超小尺寸热成像相机(从0到1 硬件-软件-外壳)

Thermal_Imaging_Camera This is a small thermal imaging camera that includes everything from hardware and software. 小尺寸热成像相机-Pico-LVGL-RTOS 基于RP2040 Pico主控与RTOS&#xff0c;榨干双核性能实现LVGL和成图任务并行。ST7789驱动240280屏&#xff0c;CST8…

网络协议入门:OSI模型与TCP/IP栈

在网络通信的世界中&#xff0c;数据从一台设备传输到另一台设备&#xff0c;需要遵循一系列规则&#xff0c;这些规则统称为网络协议。OSI模型和TCP/IP协议栈作为网络通信的基石&#xff0c;帮助我们理解数据传输的全流程。这篇文章将深入解析它们的结构、功能和实际应用&…

HackMyVM-Klim靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 CVE-2008-0166 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.159.127) 靶 机&#xff1a;debian(192.168.159.27) 注意事…

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…

docker 使用远程镜像启动一个容器

使用前提&#xff1a; 首先你得安装docker,其次你得拥有一个远程镜像 docker run --name io_11281009 --rm -it -p 2233:22 -v .:/root/py -e ed25519_rootAAAAC3NzaC1lZDI1********Oy7zR7l7aUniR2rul ghcr.lizzie.fun/fj0r/io srv对上述命令解释&#xff1a; 1.docker run:…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

Linux -- HTTP 请求 与 响应 报文

目录 请求报文&#xff1a; 请求方法 响应报文&#xff1a; 状态码 与 状态码描述 共性 常见的报头 请求报文&#xff1a; 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…

小米平板pad6工程固件界面预览 修复tee损坏 修复底层分区 开diag端口

💝💝💝小米平板pad6 机型代码pipa。采用一块分辨率为 2880*1800p,支持 120/144Hz 高刷新率的国产屏,并且屏幕支持 HDR10 + 以及杜比视界。分别搭载 SM8250AC(骁龙 870)、SM8475(骁龙 8+)处理器。也适用于以下型号的小米机型:23043RP34G, 23043RP34I, 23043RP34C等…

day03_开发前准备和匹配类标签

文章目录 day03_开发前准备和匹配类标签一、标签体系(了解)二、数据导入(操作)1、背景介绍(重要)2、创建Hive表2.1 dwm_sold_goods_sold_dtl_i2.2 dwm_sell_o2o_order_i**2.3 dwd_mem_member_union_i**2.4 dwm_mem_member_behavior_day_i**2.5 dwm_mem_first_buy_i**3、数…

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理 2.功能 3.特点 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是一个免费的、开源的实时操作系统&#xff0c;专为微控制器和嵌入…

第十三章:数据库技术

文章目录&#xff1a; 一&#xff1a;基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二&#xff1a;Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…