Allocate bikes to people - First Priority (Closest bike to closest person)

前端 未结 2 1372
南方客
南方客 2021-02-10 01:48

Passing in a grid to a function with bikes and person at locations

[ \'c\' , \'_\' ,\'A\' ,\'_\', \'_\' , \'_\']
[ \'_\' , \'_\' ,\'a\' ,\'_\', \'_\' , \'_\']
[          


        
2条回答
  •  星月不相逢
    2021-02-10 02:22

    If I understand correctly, you're almost there. What you need to do is indeed find all the combinations of people and bikes, and measure their distance. Then, you sort these based on distance, and then you can iterate over them and assign the bikes to the people whenever you come across a combination where the person doesn't have a bike yet and the bike is still free. This will assign a different bike to each person, and use the shortest distances first. In javascript that could look something like:

    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)));

    Note: I'm interpreting the grid as displayed in the code, with x = horizontal and y = vertical, i.e. grid[y][x], with (0,0) being the top left corner.

提交回复
热议问题