代码之家  ›  专栏  ›  技术社区  ›  Dhaval Jardosh

将自行车分配给人-第一优先级(最近的自行车到最近的人)

  •  4
  • Dhaval Jardosh  · 技术社区  · 6 年前

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

    [ 'c' , '_' ,'A' ,'_', '_' , '_']
    [ '_' , '_' ,'a' ,'_', '_' , '_']
    [ '_' , '_' ,'_' ,'_', 'b' , '_']
    [ '_' , '_' ,'_' ,'_', '_' , '_']
    [ 'D' , 'd' ,'_' ,'_', '_' , 'B']
    [ '_' , '_' ,'_' ,'C', '_' , '_']
    

    [A:1, B:3, C:8, D:1]

    其中A是人,1是到达自行车所需的步骤。

    标准:

    1. 单车不能分配给两个人
    2. 一辆自行车与一个人的距离永远不等于同一辆自行车与另一个人的距离。

    我觉得用图形表示可能更有意义

    enter image description here


    我的方法:

    1. 找到自行车和人的位置并将它们存储在一个数组中。

      person = [[0,2],[4,0],[4,5],[5,3]], bikes = [[0,0],[1,2],[2,4],[4,1]];

    2. 谁的最短路径为1,并不断增加最短路径1。 并将人和自行车存储到结果数组中。

    3. 需要继续执行第2步直到我们的人的阵法为空

    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);
    2 回复  |  直到 6 年前
        1
  •  3
  •   m69 ''snarky and unwelcoming''    6 年前

    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=垂直,即网格[y][x],其中(0,0)是左上角。

        2
  •  2
  •   xashru    6 年前

    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. 创建一个数组 每对人和每辆自行车的物品。因此,对于上面的示例,您将有对象值
      [(0, 0, 2), (0, 1, 1), ...(3, 3, 3)]

    4. 通过增加 dist
    5. 创建两个布尔数组person\u used和bike\u used,person\u used和bike\u used的元素数相同(都初始化为false)。
      person_used = [false, false, false, false], bike_used = [false, false, false, false]

    6. 距离 对象 person_used[person_id] == false && bike_used[bike_id] == false person_used[person_id] and bike_used[bike_id] to true . 如果其中一个是 false 你可以忽略它。