首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配自行车给人们-第一优先(最近的自行车最接近的人)

分配自行车给人们-第一优先(最近的自行车最接近的人)
EN

Stack Overflow用户
提问于 2018-08-29 00:01:23
回答 2查看 1.7K关注 0票数 5

将网格传递给带有自行车和个人的函数

代码语言:javascript
复制
[ 'c' , '_' ,'A' ,'_', '_' , '_']
[ '_' , '_' ,'a' ,'_', '_' , '_']
[ '_' , '_' ,'_' ,'_', 'b' , '_']
[ '_' , '_' ,'_' ,'_', '_' , '_']
[ 'D' , 'd' ,'_' ,'_', '_' , 'B']
[ '_' , '_' ,'_' ,'C', '_' , '_']

输出:,类似于这个[A:1, B:3, C:8, D:1]

A是人,1是到达自行车所需的一步。

准则:

  1. 离自行车最近的人,把自行车放在第一位。
  2. 单人自行车不能分配给两个人
  3. 自行车与一个人之间的距离绝不等于同一辆自行车与另一个人之间的距离。
  4. 距离可以相等,但两个不同的自行车和两个不同的个体。

因此,我觉得图形表示可能更有意义。

我的方法:

  1. 找到自行车和人的位置,并将它们存储在数组中。 person = [[0,2],[4,0],[4,5],[5,3]], bikes = [[0,0],[1,2],[2,4],[4,1]];
  2. 当最短路径为1时,从数组中移除最短路径为1的自行车和人员,并将最短路径递增1,并将人和自行车存储到结果数组中。
  3. 需要继续做第二步,直到我们的人的数组是空的

代码语言:javascript
复制
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);

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 02:05:41

如果我没听错,你就快到了。你需要做的是找到所有的人和自行车的组合,并测量他们的距离。然后,你根据距离对它们进行排序,然后你可以迭代它们,然后每当你遇到一个组合时,当你遇到一个人还没有自行车,而自行车仍然是免费的时候,你就可以把自行车分配给人们。这将为每个人分配一辆不同的自行车,并且首先使用最短的距离。在javascript中,它可能类似于:

代码语言: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)。

票数 3
EN

Stack Overflow用户

发布于 2018-08-29 02:27:48

我会为你勾勒出这些步骤

  1. 找到自行车和人的位置,并将它们存储在数组中。 person = [[0,2],[4,0],[4,5],[5,3]], bikes = [[0,0],[1,2],[2,4],[4,1]];
  2. 定义具有以下变量的类(让我们称之为Distance): person_id: use person index (0, 1, 2, ...) bike_id: use bike index (0, 1, 2, ...) dist: distance between this person and bike
  3. 为每对人和自行车创建一个Distance对象数组。因此,对于上面的示例,您将拥有对象值。 [(0, 0, 2), (0, 1, 1), ...(3, 3, 3)]
  4. 通过增加dist值对数组进行排序
  5. 创建两个布尔数组,person_used的元素数与人员数相同,bike_used的元素数与自行车数相同(都初始化为false)。 person_used = [false, false, false, false], bike_used = [false, false, false, false]
  6. 遍历数组。如果对于当前的Distance对象,person_used[person_id] == false && bike_used[bike_id] == false将这个人分配给这个自行车并设置两个person_used[person_id] and bike_used[bike_id] to true。如果两者都是false,您可以忽略它。
  7. 当每个人都被分配了一辆自行车时,停下来。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52067697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档