Talk:Divide-TADM2E
From Algorithm Wiki
Solution in Java:
public static void main(String[] args) {
boolean[][] bad = { {false,true,false,false,false,true}, {false,true,false,true,false,true}, {false,true,false,true,false,true}, {false,true,false,true,false,true}, {false,true,false,true,false,true}, {false,false,false,true,false,false}, }; boolean[][] visited = new boolean[bad.length][bad.length]; int[][] cost = new int[bad.length][bad.length]; for (int i = 0; i < cost.length; i++) { for (int j = 0; j < cost.length; j++) { cost[i][j] = Integer.MAX_VALUE; } } int result = shortestPath(bad,visited,cost); System.out.println(result); }
private static class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; }
public Point toRight() { return new Point(x+1,y); }
public Point toDown() { return new Point(x, y+1); }
public Point toLeft() { return new Point(x-1,y); }
public Point toUp() { return new Point(x,y-1); } }
public static int shortestPath(boolean[][] bad, boolean[][] visited, int[][] cost) {
int length = bad.length; if (bad[0][0] || bad[length-1][length-1]) { return -1; } ArrayList<Point> queue = new ArrayList<>(); queue.add(new Point(0,0)); cost[0][0] = 0; Point next = null; while (!queue.isEmpty()) { next = queue.remove(0); if (next.x == length-1 && next.y == length-1) { return cost[next.x][next.y]; } visited[next.x][next.y] = true; Point nextRight = next.toRight(); if (canMoveRightFrom(next, length, bad)) { if (!visited(visited,nextRight,length)) { queue.add(nextRight); } if (cost[nextRight.x][nextRight.y] > cost[next.x][next.y] + 1) { cost[nextRight.x][nextRight.y] = cost[next.x][next.y] + 1; } } Point nextDown = next.toDown(); if (canMoveDownFrom(next, length, bad)) { if (!visited(visited,nextDown,length)) { queue.add(nextDown); } if (cost[nextDown.x][nextDown.y] > cost[next.x][next.y] + 1) { cost[nextDown.x][nextDown.y] = cost[next.x][next.y] + 1; } } Point nextUp = next.toUp(); if (canMoveUpFrom(next, length, bad)) { if (!visited(visited,nextUp,length)) { queue.add(nextUp); } if (cost[nextUp.x][nextUp.y] > cost[next.x][next.y] + 1) { cost[nextUp.x][nextUp.y] = cost[next.x][next.y] + 1; } } Point nextLeft = next.toLeft(); if (canMoveLeftFrom(next, length, bad)) { if (!visited(visited,nextLeft,length)) { queue.add(nextLeft); } if (cost[nextLeft.x][nextLeft.y] > cost[next.x][next.y] + 1) { cost[nextLeft.x][nextLeft.y] = cost[next.x][next.y] + 1; } } } return -2; }