将网格传递给带有自行车和个人的函数
[ 'c' , '_' ,'A' ,'_', '_' , '_']
[ '_' , '_' ,'a' ,'_', '_' , '_']
[ '_' , '_' ,'_' ,'_', 'b' , '_']
[ '_' , '_' ,'_' ,'_', '_' , '_']
[ 'D' , 'd' ,'_' ,'_', '_' , 'B']
[ '_' , '_' ,'_' ,'C', '_' , '_']输出:,类似于这个[A:1, B:3, C:8, D:1]
A是人,1是到达自行车所需的一步。
准则:
因此,我觉得图形表示可能更有意义。

我的方法:
person = [[0,2],[4,0],[4,5],[5,3]], bikes = [[0,0],[1,2],[2,4],[4,1]];
function findBikesForPeople(grid) {
let row_length = grid.length;
let col_length = grid[0].length;
var bikes = [],
person = [];
for (var row = 0; row < row_length; row++) {
for (var col = 0; col < col_length; col++) {
if (grid[row][col] === 'B') {
bikes.push([row, col]);
}
if (grid[row][col] === 'P') {
person.push([row, col]);
}
}
}
var distances = (bikes, person) => {
var dist = [];
person.map((single) => {
var inner = [];
bikes.map((bike) => {
inner.push(check_distance(single, bike));
})
dist.push(inner);
})
return dist;
}
//This isn't right
var AllocateBikes = (distances) => {
//var result = [];
//var min = 1;
//var increment = 0;
// let people = distances.length;
//let bikeCount = distances[0].length;
//while (people > 0) {
// if (Math.min(...distances[]))
// }
return distances;
}
function check_distance(a, b) {
return Math.abs(b[1] - a[1]) + Math.abs(b[0] - a[0]);
}
let distance_between = distances(bikes, person);
console.log(AllocateBikes(distance_between));
}
var grid = [
['P', '_', 'B', '_', '_'],
['_', '_', '_', '_', 'B'],
['_', '_', '_', '_', '_'],
['_', 'P', '_', '_', '_'],
['_', '_', '_', '_', 'B']
];
findBikesForPeople(grid);
发布于 2018-08-29 02:05:41
如果我没听错,你就快到了。你需要做的是找到所有的人和自行车的组合,并测量他们的距离。然后,你根据距离对它们进行排序,然后你可以迭代它们,然后每当你遇到一个组合时,当你遇到一个人还没有自行车,而自行车仍然是免费的时候,你就可以把自行车分配给人们。这将为每个人分配一辆不同的自行车,并且首先使用最短的距离。在javascript中,它可能类似于:
function findBikesForPeople(grid) {
var rows = grid.length, cols = grid[0].length;
var bikes = [], people = [];
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
if (grid[row][col] === 'B') {
bikes.push({y: row, x:col});
}
if (grid[row][col] === 'P') {
people.push({y:row, x:col});
}
}
}
var combis = [];
for (var p in people) {
for (var b in bikes) {
var d = distance(people[p], bikes[b]);
combis.push({person:p, bike:b, distance:d});
}
}
combis.sort(function(a,b) {return a.distance - b.distance});
var hasBike = [], isTaken = [], assignment = [];
for (var c in combis) {
var person = combis[c].person, bike = combis[c].bike;
if (!hasBike[person] && !isTaken[bike]) {
assignment.push({person:person,
px:people[person].x, py:people[person].y,
bike:bike,
bx:bikes[bike].x, by:bikes[bike].y});
hasBike[person] = true;
isTaken[bike] = true;
}
}
return assignment;
function distance(a, b) {
return Math.abs(b.x - a.x) + Math.abs(b.y - a.y);
}
}
var grid = [['B', '_', 'P', '_', '_', '_'],
['_', '_', 'B', '_', '_', '_'],
['_', '_', '_', '_', 'B', '_'],
['_', '_', '_', '_', '_', '_'],
['P', 'B', '_', '_', '_', 'P'],
['_', '_', '_', 'P', '_', '_']];
document.write(JSON.stringify(findBikesForPeople(grid)));
注意:我解释代码中显示的网格,其中x=水平,y=垂直,即gridy,左上角为(0,0)。
发布于 2018-08-29 02:27:48
我会为你勾勒出这些步骤
person = [[0,2],[4,0],[4,5],[5,3]], bikes = [[0,0],[1,2],[2,4],[4,1]];Distance):
person_id: use person index (0, 1, 2, ...) bike_id: use bike index (0, 1, 2, ...) dist: distance between this person and bikeDistance对象数组。因此,对于上面的示例,您将拥有对象值。
[(0, 0, 2), (0, 1, 1), ...(3, 3, 3)]dist值对数组进行排序person_used = [false, false, false, false], bike_used = [false, false, false, false]Distance对象,person_used[person_id] == false && bike_used[bike_id] == false将这个人分配给这个自行车并设置两个person_used[person_id] and bike_used[bike_id] to true。如果两者都是false,您可以忽略它。https://stackoverflow.com/questions/52067697
复制相似问题