本文主要是介绍万马合一之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);}
}
这篇关于万马合一之js解答的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!