Untitled
unknown
plain_text
3 years ago
5.1 kB
18
Indexable
package pl.amen;
import java.awt.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class Solution {
public static void solution(int[][] maze) {
boolean[][] visited = new boolean[maze.length][maze.length];
Queue<JumpState> jumpStateStack = new LinkedList<>();
jumpStateStack.add(new JumpState(new Point(0, 0), 1, false));
while (!jumpStateStack.isEmpty()) {
// printMaze(maze, visited);
JumpState currentState = jumpStateStack.poll();
if (visited[currentState.point.x][currentState.point.y]) {
continue;
}
visited[currentState.point.x][currentState.point.y] = true;
if (currentState.point.x == maze.length - 1 && currentState.point.y == maze.length - 1) {
System.out.printf("found it, length = " + currentState.length);
break;
}
if (((currentState.point.x + 1) < maze.length)) {
// if (!visited[currentState.point.x + 1][currentState.point.y]) {
if (maze[currentState.point.x + 1][currentState.point.y] == 1 && !currentState.wallRemoved) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x + 1, currentState.point.y), currentState.length + 1, true));
}
if (maze[currentState.point.x + 1][currentState.point.y] == 0) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x + 1, currentState.point.y), currentState.length + 1, currentState.wallRemoved));
}
// }
}
if (((currentState.point.y + 1)) < maze.length) {
// if (!visited[currentState.point.x][currentState.point.y + 1]) {
if (maze[currentState.point.x][currentState.point.y + 1] == 1 && !currentState.wallRemoved) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x, currentState.point.y + 1), currentState.length + 1, true));
}
if (maze[currentState.point.x][currentState.point.y + 1] == 0) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x, currentState.point.y + 1), currentState.length + 1, currentState.wallRemoved));
}
// }
}
if (((currentState.point.x - 1) >= 0)) {
// if (!visited[currentState.point.x - 1][currentState.point.y]) {
if (maze[currentState.point.x - 1][currentState.point.y] == 1 && !currentState.wallRemoved) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x - 1, currentState.point.y), currentState.length + 1, true));
}
if (maze[currentState.point.x - 1][currentState.point.y] == 0) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x - 1, currentState.point.y), currentState.length + 1, currentState.wallRemoved));
}
// }
}
if (((currentState.point.y - 1) >= 0)) {
// if (!visited[currentState.point.x][currentState.point.y - 1]) {
if (maze[currentState.point.x][currentState.point.y - 1] == 1 && !currentState.wallRemoved) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x, currentState.point.y - 1), currentState.length + 1, true));
}
if (maze[currentState.point.x][currentState.point.y - 1] == 0) {
jumpStateStack.add(new JumpState(new Point(currentState.point.x, currentState.point.y - 1), currentState.length + 1, currentState.wallRemoved));
}
// }
}
}
System.out.println("No exit");
}
public static void printMaze(int[][] maze, boolean[][] visited) {
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[i].length; j++) {
System.out.print("" + maze[i][j]);
}
System.out.println();
}
System.out.println();
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[i].length; j++) {
System.out.print("" + (visited[i][j] ? '1' : '0'));
}
System.out.println();
}
System.out.println();
System.out.println();
}
public static void main(String[] args) {
Solution.solution(new int[][]{{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}});
}
public static class JumpState {
Point point;
int length;
boolean wallRemoved;
public JumpState(Point point, int length, boolean wallRemoved) {
this.point = point;
this.length = length;
this.wallRemoved = wallRemoved;
}
}
}
Editor is loading...