2
public int minimumMoves(int[][] grid) {5
// boolean[][][][] visited = new boolean[n][n][n][n];6
Set<Position> set = new HashSet<>();8
Queue<Position> q = new LinkedList<>();9
q.offer(new Position(0, 0, 0, 1));12
if (grid[n - 1][n - 2] == 1 || grid[n - 1][n - 1] == 1) return -1;14
while (!q.isEmpty()) {16
Queue<Position> nextq = new LinkedList<>();17
while (!q.isEmpty()) {19
Position p = q.poll();26
if (r1 == n - 1 && r2 == n - 1 && c1 == n - 2 && c2 == n - 1) return count - 1;28
if (set.contains(p)) continue;30
if (c1 + 1 < n && grid[r1][c1 + 1] != 1 && c2 + 1 < n && grid[r2][c2 + 1] != 1)31
nextq.offer(new Position(r1, c1 + 1, r2, c2 + 1));32
if (r1 + 1 < n && grid[r1 + 1][c1] != 1 && r2 + 1 < n && grid[r2 + 1][c2] != 1)33
nextq.offer(new Position(r1 + 1, c1, r2 + 1, c2));38
&& grid[r1 + 1][c1] == 039
&& grid[r2 + 1][c2] == 040
&& grid[r1 + 1][c1] == 0) nextq.offer(new Position(r1, c1, r1 + 1, c1));45
&& grid[r1][c1 + 1] == 046
&& grid[r2][c1 + 1] == 047
&& grid[r1][c1 + 1] == 0) nextq.offer(new Position(r1, c1, r1, c1 + 1));55
private class Position {61
public Position(int r1, int c1, int r2, int c2) {85
public int hashCode() {88
result = prime * r1 + c1 + prime * r2 + c2;93
public boolean equals(Object obj) {94
Position p = (Position) obj;95
if (this.r1 == p.getr1()96
&& this.r2 == p.getr2()97
&& this.c1 == p.getc1()98
&& this.c2 == p.getc2()) return true;