import java.util.*;
final class Coordinate {
private final int x;
private final int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
class Maze {
private final int[][] maze;
public Maze(int[][] maze) {
if (maze == null) {
}
if (maze.length == 0) {
}
this.maze = maze;
}
public List<Coordinate> solve() {
return getMazePath(0, 0, new Stack<Coordinate>());
}
private List<Coordinate> getMazePath(int row, int col, Stack<Coordinate> stack) {
assert stack != null;
stack.add(new Coordinate(row, col));
if ((row == maze.length - 1) && (col == maze[0].length - 1)) {
Coordinate[] coordinateArray = stack.toArray(new Coordinate[stack.size()]);
return Arrays.
asList(coordinateArray
); }
for (int j = col; j < maze[row].length; j++) {
if ((j + 1) < maze[row].length && maze[row][j + 1] == 1) {
return getMazePath(row, j + 1, stack);
}
if ((row + 1) < maze.length && maze[row + 1][col] == 1) {
return getMazePath(row + 1, col, stack);
}
}
}
public static void main
(String[] args
) { int[][] m = { {1, 1, 1},
{1, 0, 1},
{1, 1, 0},
{0, 1, 1} };
Maze maze = new Maze(m);
for (Coordinate coord : maze.solve()) {
System.
out.
println(coord.
getX() + " : " + coord.
getY()); }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKZmluYWwgY2xhc3MgQ29vcmRpbmF0ZSB7CiAgICBwcml2YXRlIGZpbmFsIGludCB4OwogICAgcHJpdmF0ZSBmaW5hbCBpbnQgeTsKCiAgICBwdWJsaWMgQ29vcmRpbmF0ZShpbnQgeCwgaW50IHkpIHsKICAgICAgICB0aGlzLnggPSB4OyAKICAgICAgICB0aGlzLnkgPSB5OwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0WCgpIHsKICAgICAgICByZXR1cm4geDsKICAgIH0KCiAgICBwdWJsaWMgaW50IGdldFkoKSB7CiAgICAgICAgcmV0dXJuIHk7CiAgICB9Cn0KCmNsYXNzIE1hemUgewoKICAgIHByaXZhdGUgZmluYWwgaW50W11bXSBtYXplOwoKICAgIHB1YmxpYyBNYXplKGludFtdW10gbWF6ZSkgewogICAgICAgIGlmIChtYXplID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgaW5wdXQgbWF6ZSBjYW5ub3QgYmUgbnVsbCIpOwogICAgICAgIH0KICAgICAgICBpZiAobWF6ZS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc2l6ZSBvZiBtYXplIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCIpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5tYXplID0gbWF6ZTsKICAgIH0KCiAgICBwdWJsaWMgTGlzdDxDb29yZGluYXRlPiBzb2x2ZSgpIHsKICAgICAgICByZXR1cm4gZ2V0TWF6ZVBhdGgoMCwgMCwgbmV3IFN0YWNrPENvb3JkaW5hdGU+KCkpOwogICAgfQoKICAgIHByaXZhdGUgTGlzdDxDb29yZGluYXRlPiBnZXRNYXplUGF0aChpbnQgcm93LCBpbnQgY29sLCBTdGFjazxDb29yZGluYXRlPiBzdGFjaykgewogICAgICAgIGFzc2VydCBzdGFjayAhPSBudWxsOwoKICAgICAgICBzdGFjay5hZGQobmV3IENvb3JkaW5hdGUocm93LCBjb2wpKTsKCiAgICAgICAgaWYgKChyb3cgPT0gbWF6ZS5sZW5ndGggLSAxKSAmJiAoY29sID09IG1hemVbMF0ubGVuZ3RoIC0gMSkpIHsKICAgICAgICAgICAgQ29vcmRpbmF0ZVtdIGNvb3JkaW5hdGVBcnJheSA9IHN0YWNrLnRvQXJyYXkobmV3IENvb3JkaW5hdGVbc3RhY2suc2l6ZSgpXSk7CiAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGNvb3JkaW5hdGVBcnJheSk7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBqID0gY29sOyBqIDwgbWF6ZVtyb3ddLmxlbmd0aDsgaisrKSB7CgogICAgICAgICAgICBpZiAoKGogKyAxKSA8IG1hemVbcm93XS5sZW5ndGggJiYgbWF6ZVtyb3ddW2ogKyAxXSA9PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWF6ZVBhdGgocm93LCBqICsgMSwgc3RhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoKHJvdyArIDEpIDwgbWF6ZS5sZW5ndGggJiYgbWF6ZVtyb3cgKyAxXVtjb2xdID09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYXplUGF0aChyb3cgKyAxLCBjb2wsIHN0YWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICAgfQoKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgaW50W11bXSBtID0geyAgezEsIDEsIDF9LAogICAgICAgICAgICAgICAgICAgICAgIHsxLCAwLCAxfSwKCQkJCQkgICB7MSwgMSwgMH0sICAgICAgICAgICAgICAgICAgICAgICAKCQkJCQkgICB7MCwgMSwgMX0gfTsKCiAgICAgICAgTWF6ZSBtYXplID0gbmV3IE1hemUobSk7CgogICAgICAgIGZvciAoQ29vcmRpbmF0ZSBjb29yZCA6ICBtYXplLnNvbHZlKCkpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvb3JkLmdldFgoKSArICIgOiAiICsgY29vcmQuZ2V0WSgpKTsKICAgICAgICB9CiAgICB9Cn0=