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

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+ce.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=0for i in range(m): #i表示行数for j in range(n): #j表示列数#如果字符串中该字符为1,提取该位置坐标,并加入到a列表中if c[count]=='1':a.append([i,j])count=count+1return 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=0n=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=0for 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.rhkb.cn/news/4620.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状&#xff0c;关键技术 创新方向&#xff0c;以及行业应用的具体情况&#xff0c;通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

Unity Shader学习日记 part5 CG基础

在了解完Shader的基本结构之后&#xff0c;我们再来看看编写着色器的语言。 Shader编写语言有CG&#xff0c;HLSL两种&#xff0c;我们主要学习CG的写法。 数据类型 CG的基础变量类型 uint a12;//无符号32位整形 int b12;//32位整形float f1.2f;//32位浮点型 half h1.2h;//…

AI Agent:深度解析与未来展望

一、AI Agent的前世&#xff1a;从概念到萌芽 &#xff08;一&#xff09;早期探索 AI Agent的概念可以追溯到20世纪50年代&#xff0c;早期的AI研究主要集中在简单的规则系统上&#xff0c;这些系统的行为是确定性的&#xff0c;输出由输入决定。随着时间的推移&#xff0c;…

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

计算机网络 (46)简单网络管理协议SNMP

前言 简单网络管理协议&#xff08;SNMP&#xff0c;Simple Network Management Protocol&#xff09;是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议&#xff0c;它使网络管理员能够管理网络效能&#xff0c;发现并解决网…

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航

在机器人技术的发展中&#xff0c;“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中&#xff0c;“大脑”作为机器人的核心决策单元&#xff0c;承担着复杂任务规划、环境感知和决策制定的重要角色&#xff0c;而“小脑”则专注于运动控制和实时调整。这种分工明确…

Linux 使用 GDB 进行调试的常用命令与技巧

GDB 调试的常用命令与技巧 1. GDB 常用命令1.1 安装 GDB1.2 启动 GDB1.3 设置程序的参数1.4 设置断点1.5 启动程序并运行至断点1.6 执行一步1.7 打印变量值1.8 查看函数调用栈 2. GDB 调试 Core 文件2.1 生成 Core 文件2.2 使用 GDB 调试 Core 文件 3. GDB 调试正在运行的程序3…

光谱相机如何还原色彩

多光谱通道采集 光谱相机设有多个不同波段的光谱通道&#xff0c;可精确记录每个波长的光强信息。如 8 到 16 个甚至更多的光谱通道&#xff0c;每个通道负责特定波长范围的光信息记录。这使得相机能分辨出不同光谱组合产生的相同颜色感知&#xff0c;而传统相机的传感器通常只…

AUTOSAR从入门到精通-线控底盘技术

目录 几个高频面试题目 为何高阶智能驾驶需要线控底盘 线控底盘与传统底盘有何区别? 算法原理 线控技术发展背景 国外研究现状 国内研究现状 什么是线控底盘? 组成结构是什么? 线控底盘的发展: 线控底盘名词解释: 汽车线控系统关键技术 线控底盘的组成 电子…

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展&#xff0c;越来越多的卖家开始尝试使用云手机来协助他们的业务&#xff0c;这是因为云手机具有许多优势。那么&#xff0c;具体来说&#xff0c;跨境电商使用云手机可以做哪些事情呢&#xff1f; &#xff08;一&#xff09;实现多账号登录和管理 跨境电商…

springboot项目属性配置方式

基于上篇博客 springboot项目部署到本地&#xff0c;本博客主要讲springboot项目属性配置方式&#xff0c;这篇文章将在后几天持续维护、更新。

Java 多态/向下转型/instanceof

1. 多态 1.1 概述 多态&#xff1a;事务的不同形态&#xff0c;如 动物&#xff0c;其有多种形态&#xff1a;猫&#xff0c;狗之类的&#xff1b; 1.2 使用方法 虚拟方法&#xff08;父类被重写的方法在多态中叫做虚拟方法&#xff09;调用&#xff1a; 父类引用指向子类…

【Maven】resources-plugin

在使用maven的项目中&#xff0c;它默认加载的是resources目录下的资源文件&#xff0c;像properties、xml 这类资源文件&#xff0c;但有时候可能会定义在java 源码目录下&#xff0c;这时候运行项目就会报找不到资源文件的错误 来到classpath 下&#xff0c;发现没有这个xsd…

我的创作纪念日——我与CSDN一起走过的365天

目录 一、机缘&#xff1a;旅程的开始 二、收获&#xff1a;沿路的花朵 三、日常&#xff1a;不断前行中 四、成就&#xff1a;一点小确幸 五、憧憬&#xff1a;梦中的重点 一、机缘&#xff1a;旅程的开始 最开始开始写博客是在今年一二月份的时候&#xff0c;也就是上一…

Restormer: Efficient Transformer for High-Resolution Image Restoration解读

论文地址&#xff1a;Restormer: Efficient Transformer for High-Resolution Image Restoration。 摘要 由于卷积神经网络&#xff08;CNN&#xff09;在从大规模数据中学习可推广的图像先验方面表现出色&#xff0c;这些模型已被广泛应用于图像复原及相关任务。近年来&…

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址&#xff1a;www.hw.com/api/upload转发地址&#xff1a;http://…

RavenMarket:用AI和区块链重塑预测市场

不论是美股市场还是加密市场&#xff0c;AI都是本轮周期里的最大叙事。本轮AI的最大受益者英伟达市值超越苹果一跃成为全球第一大公司&#xff0c;加密领域围绕着AI的创新也是层出不穷&#xff0c;很多项目方开始向着AI转型。 而近期币圈最热门的板块就是AI agent&#xff0c;…

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…