储物柜应用方法

时间:2016-06-20 15:44:07

标签: java arrays

这是我正在建造的储物柜应用程序,可确保放置储物柜,以便城市中的顾客总是在距离储物柜的一小段距离内。为了解决这个问题,我需要一种方法来为储物柜放置和储物柜的距离建模。

为此,我提供以下内容:

  1. 正数整数范围1-9,表示您所在城市的城市长度
  2. 正数整数范围1-9表示您所在城市街区​​的宽度
  3. 包含表示锁定位置的所有X坐标的数组,每个X坐标范围为1-9。
  4. 包含表示锁定位置的所有Y坐标的数组,每个Y坐标范围为1-9。
  5. 这里的工作是构建城市的2D网格。网格的每个元素应该是一个正整数,用于指定壁橱柜的块数。两个块之间的距离是它们的水平和垂直距离的总和(因此,对角线方向上的移动被认为是2的距离)。将网格返回为2D整数数组,其中第一个索引对应于X维度,第二个索引与Y方向对应。

    示例#1:

    鉴于:

    1. 3
    2. 5
    3. [1]
    4. [1]
    5. 返回:

      CREATE TABLE IF NOT EXISTS `build` (
          `ID` int(11) NOT NULL AUTO_INCREMENT,
          `Version` varchar(20) NOT NULL,
          `Date` datetime DEFAULT NULL,  
          PRIMARY KEY (`ID`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
      IF EXISTS(select 1 from build where Versao = '1.1') THEN select "yes";
      

      示例#2:

      鉴于:

      1. 5
      2. 7
      3. [2,4]
      4. [3,7]
      5. 返回:

        012
        123
        234
        345
        456
        

        这是我要使用的方法:

        static int [] [] getLockerDistanceGrid(int cityLength,int cityWidth,int [] lockerXCoordinates,int [] lockerYCoordinates){     }

        我该怎么做?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我用一点修改过的BFS解决了它

private static class Node {
    public Node (int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int x, y;
}

static int[][] getLockerDistanceGridBfs(int cityLength, int cityWidth, int[] lockerXCoordinates, int[] lockerYCoordinates) {
    if (lockerXCoordinates == null || lockerYCoordinates == null || lockerXCoordinates.length != lockerYCoordinates.length)
        return null;

    int[][] city = new int[cityWidth][cityLength];
    for (int i = 0; i < city[0].length; i++)
        for (int j = 0; j < city.length; j++)
            city[j][i] = Integer.MAX_VALUE;

    Queue<Node> nodesToDo = new LinkedList<>();
    for (int i = 0; i < lockerXCoordinates.length; i++) {
        city[lockerXCoordinates[i] - 1][lockerYCoordinates[i] - 1] = 0;
        nodesToDo.add(new Node(lockerXCoordinates[i] - 1, lockerYCoordinates[i] - 1));
    }

    while(!nodesToDo.isEmpty()) {
        Node v = nodesToDo.poll();
        int newDist = city[v.x][v.y] + 1;
        List<Node> neighbours = getNeighbours(cityLength, cityWidth, v.x, v.y);
        for(Node node : neighbours) {
            if(newDist < city[node.x][node.y]) {
                city[node.x][node.y] = newDist;
                nodesToDo.add(node);
            }
        }
    }

    return city;
}

private static List<Node> getNeighbours(int cityLength, int cityWidth, int x, int y) {
    List<Node> result = new ArrayList<>(4);
    if(x - 1 >= 0) {
        result.add(new Node(x - 1, y));
    }
    if(y - 1 >= 0) {
        result.add(new Node(x, y - 1));
    }
    if(x + 1 < cityWidth) {
        result.add(new Node(x + 1, y));
    }
    if(y + 1 < cityLength) {
        result.add(new Node(x, y + 1));
    }

    return result;
}