这是我正在建造的储物柜应用程序,可确保放置储物柜,以便城市中的顾客总是在距离储物柜的一小段距离内。为了解决这个问题,我需要一种方法来为储物柜放置和储物柜的距离建模。
为此,我提供以下内容:
这里的工作是构建城市的2D网格。网格的每个元素应该是一个正整数,用于指定壁橱柜的块数。两个块之间的距离是它们的水平和垂直距离的总和(因此,对角线方向上的移动被认为是2的距离)。将网格返回为2D整数数组,其中第一个索引对应于X维度,第二个索引与Y方向对应。
示例#1:
鉴于:
返回:
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:
鉴于:
返回:
012
123
234
345
456
这是我要使用的方法:
static int [] [] getLockerDistanceGrid(int cityLength,int cityWidth,int [] lockerXCoordinates,int [] lockerYCoordinates){ }
我该怎么做?任何帮助将不胜感激!
答案 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;
}