万马合一之js解答

在这里插入图片描述
输入m和n 两个数,m和n表示一个mn 的棋盘。输入棋盘内的数据。棋盘中存在数字和".“两种字符,如果是数字表示Q该位置是一匹马,如果是”."表示该位置为空的,棋盘内的数字表示为该马能走的最大步数。例如棋盘内某个位置一个数字为k,表示该马只能移动1~k步的距离。
棋盘内的马移动类似于中国象棋中的马移动,先在水平或者垂直方向上移动一格,然后再将其移动到对角线位置。棋盘内的马可以移动到同一个位置,同一个位置可以有多匹马。
请问能否将棋盘上所有的马移动到同一个位置,若可以请输入移动的最小步数。若不可以输出0。输入描述
输入m 和n两个数,m和n表示一个m
n的棋盘。输入棋盘内的数据。输出描述
能否将棋盘上所有的马移动到同一个位置,若可以请输入移动的最小步数。若不可以输出0。

该题不考虑绊马脚

在这里插入图片描述

js题解如下

const row = 3, col = 5;
const map = [['4', '7', '.', '4', '8'],['4', '7', '4', '4', '.'],['7', '.', '.', '.', '.'],
]const directions = [[1, 2], [1, -2], [2, 1], [2, -1], [-1, 2], [-1, -2], [-2, 1], [-2, -1]];const horsePositionArray = [];  // 有马的点
const horseCouldArrivePositionArray = [];    // 与horsePositionArray一一对应for (let i = 0; i < row; i++) {for (let j = 0; j < col; j++){// 计算马可以走到的所有位置if (map[i][j] !== '.') {// 马的坐标信息const horseInfo = {row: Number(i),col: Number(j),steps: Number(map[i][j]),   // 可走步数}horsePositionArray.push(horseInfo);const couldArrivePositions = {}BFS(horseInfo.row, horseInfo.col, 0, horseInfo.steps, couldArrivePositions);horseCouldArrivePositionArray.push(couldArrivePositions);}}
}console.log(horsePositionArray);
console.log(horseCouldArrivePositionArray);// 所有符合条件的点
const sucessPositions = [];for (let i = 0; i < row; i++) {for (let j = 0; j < col; j++){const point = `${i},${j}`;// console.log(point);// 当前点是否存在于所有马的可达点let allInclude = true;// 遍历所有点,是否存在于所有马的horseCouldArrivePositionArray.forEach(item => {// console.log(!!item[point]);if (!!item[point]) {}else {allInclude = false;return;}})// 如果当前点所有马都可达,则放入if (allInclude) {sucessPositions.push(point);}}
}console.log("所有符合条件的点", sucessPositions);let minSumSteps = 0;
sucessPositions.forEach(sucessPoint => {let sum = 0;horseCouldArrivePositionArray.forEach(horseCouldArrivePositions => {sum += horseCouldArrivePositions[sucessPoint]})if (minSumSteps === 0) {minSumSteps = sum;}else if (sum < minSumSteps) {minSumSteps = sum;}
})
console.log('最终答案: ', minSumSteps - horsePositionArray.length)// couldArrivePositions为对象, 属性格式为 'x,y': 'usedStep'
function BFS(positionRow, positionCol, usedStep, leftStep, couldArrivePositions) {// console.log(positionRow, positionCol, usedStep, leftStep, couldArrivePositions);// 判断是否超出边界if (positionRow > row - 1 || positionCol > col - 1 || positionRow < 0 || positionCol < 0) {return '超出边界';}// 判断有无剩余步数if (leftStep == 0) {return couldArrivePositions;}// 是否走过该点if (couldArrivePositions[`${positionRow},${positionCol}`]) {// 如果走过, 判断usedStepconst pastUsedStep = couldArrivePositions[`${positionRow},${positionCol}`];// 如果当前步数更少,则更新步数if (usedStep + 1 < pastUsedStep) {couldArrivePositions[`${positionRow},${positionCol}`] = usedStep + 1;}}// 如果没有走过则直接放入else {couldArrivePositions[`${positionRow},${positionCol}`] = usedStep + 1;}// 八个方向发BFSfor (let i = 0; i < directions.length; i++) {BFS(positionRow + directions[i][0], positionCol + directions[i][1], usedStep + 1, leftStep - 1, couldArrivePositions);}
}

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

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

相关文章

【notepad++工具使用之】批量加逗号

背景 在使用sql语句in关键字查询时&#xff0c;我们需要把数据用逗号进行隔开&#xff0c;在数据量非常少的时候&#xff08;十几二十个这样&#xff09;&#xff0c;可以手动的去加逗号分隔符&#xff1b; 但是遇到1000个怎么弄呢&#xff1f; 强大的Notepad 批量处理数据时…

【中间件】docker的安装

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 .卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \doc…

指针的学习4

目录 回调函数 qsort使用样例 使用qsort函数排序整形数据 使用qsort函数排序结构体 回调函数 回调函数就是一个通过函数指针调用的函数。如果把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xf…

【MetaGPT】多智能体协作——你画我猜(文字版)

多智能体协作 本篇将学习 MetaGPT中的 Environment 、 Team 组件。 1. Muti Agent 概念概述 多智能体系统 (Multi-Agent System, MAS) 是由一群具有一定自主性、协同性和学习能力的智能体组成的系统。智能体在环境中相互协作&#xff0c;以达到某种目标或完成特定任务。 2. 多…

利用websocket +定时器简易的实现一个网络聊天室

其实原理非常简单,就是客户端用户通过websoket来连接websocket服务端。然后服务端,收集每个用户发出的消息, 进而将每条用户的消息通过广播的形式推送到每个连接到服务端的客户端。从而实现用户的实时聊天。 // TODO : 我主要是讲一下实现思路。并未完善其功能。 1.后端 依赖 …

【UE 材质 Niagara】爆炸效果

目录 效果 步骤 一、材质部分 二、Niagara部分 效果 步骤 一、材质部分 1. 创建一个材质&#xff0c;这里命名为“M_Burst” 打开“M_Burst”&#xff0c;设置混合模式为半透明&#xff0c;设置着色模型为无光照&#xff0c;勾选双面显示 在材质图表中首先创建扰动效果 其…

「Mybatis深入五」:动态SQL

文章目录 一、应用场景二、代码演示1、动态 **SQL** 之\<if>&#xff08;1&#xff09; 需求&#xff08;2&#xff09;代码 2、动态 **SQL** 之\<choose>&#xff08;1&#xff09; 需求&#xff08;2&#xff09;代码 3、动态 **SQL** 之\<set>&#xff08…

Google如何快速抓接口导入到postman调试

Google如何快速抓接口导入到postman调试 1、F12选择对应接口&#xff0c;右键后复制接口连接信息 2、打开postman&#xff0c;点击import 3、在raw text都粘贴 4、点击continue后&#xff0c;导入就可以了

Linux云计算运维架构师常用命令集合(2024最新整理)

系统信息 arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作cat /proc/cpuinfo 显示…

JuiceSSH结合Cpolar实现公网远程SSH访问内网Linux系统

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

2024年腾讯云服务器99元一年,最新价格整理

腾讯云服务器99元一年是真的吗&#xff1f;真的&#xff0c;只是又降价了&#xff0c;现在只要61元一年&#xff0c;配置为2核2G3M轻量应用服务器&#xff0c;40GB SSD盘&#xff0c;腾讯云百科txybk.com分享腾讯云官方活动购买链接 https://curl.qcloud.com/oRMoSucP 活动打开…

C#多线程(4)——任务并行库TPL

文章目录 1 什么是TPL2 创建与启动任务3 等待任务4 任务中的异常处理5 取消任务 1 什么是TPL T P L \textcolor{red}{TPL} TPL&#xff08;Task Parallel Library&#xff09;任务并行库&#xff0c;是从.NetFramwork4.0后引入的基于异步操作的一组API。TPL的底层是基于多线程实…