String[][] map = new String[maps.length][maps[0].length()];
int[] start = new int[2];
int[] lever = new int[2];
int[] arriv = new int[2];
for (int i = 0; i < maps.length; i++) {
for (int j = 0; j < maps[i].length(); j++) {
map[i][j] = String.valueOf(maps[i].charAt(j));
if (map[i][j].equals("S")) {
start[0] = i;
start[1] = j;
} else if (map[i][j].equals("L")) {
lever[0] = i;
lever[1] = j;
} else if (map[i][j].equals("E")) {
arriv[0] = i;
arriv[1] = j;
}
}
}
Arrays.stream(map).forEach(row -> System.out.println(Arrays.toString(row)));
System.out.println(
"시작: " + Arrays.toString(start) + " 레버: " + Arrays.toString(lever) + " 도착: " + Arrays.toString(arriv));
int re=bfs(start, lever, map);
if(re==-1){
System.out.println("래버까지도달하지못함");
return -1;
}
int re2=bfs(lever, arriv, map);
if(re2==-1){
System.out.println("출구까지도달하지못함");
return -1;
}
re=re+re2;
System.out.println(re);
return re;
}
public static int bfs(int[] start,int[] arriv, String[][] map){
int re=-1;
int mw = map[0].length;
int mh = map.length;
boolean[][] visited = new boolean[map.length][map[0].length];
System.out.println("맵사이즈: " + mw + "," + mh);
Queue<Integer[]> queue = new LinkedList<>();
queue.offer(new Integer[] { start[0], start[1], 0 });
visited[start[0]][start[1]] = true;
printvisit(visited);
boolean arrive = false;
while (!queue.isEmpty()) {
System.out.println("위치 탐색 예정 큐" +
queue.stream()
.map(Arrays::toString)
.toList());
Integer[] index = queue.poll();
Integer wid = index[1];
Integer hig = index[0];
Integer count = index[2];
System.out.println("현재좌표: " + hig + "," + wid);
if (wid == arriv[1]&& hig == arriv[0]) {
System.out.println(count+"번쨰만에 출구 또착");
re = count;
arrive = true;
break;
}
Integer right = wid + 1;
Integer left = wid - 1;
Integer up = hig - 1;
Integer down = hig + 1;
System.out.println("전진예정좌표: 오른쪽(" + hig + "," + right + ") 왼쪽(" + hig + "," + left + ") 위(" + up + "," + wid
+ ") 아래(" + down + "," + wid + ")");
if (right <= mw - 1) {
System.out.println("오른쪽전진: " + hig + "," + right);
String flg = map[hig][right];
System.out.println("전진값: " + flg);
if (!flg.equals( "X") && !visited[hig][right]) {
System.out.println("O이므로 위치 저장가능");
visited[hig][right] = true;
printvisit(visited);
queue.offer(new Integer[] { hig, right, count + 1 });
}
}
if (left >= 0) {
System.out.println("왼쪽전진: " + hig + "," + left);
String flg = map[hig][left];
System.out.println("전진값: " + flg);
if (!flg.equals( "X") && !visited[hig][left]) {
System.out.println("O이므로 위치 저장가능");
visited[hig][left] = true;
printvisit(visited);
queue.offer(new Integer[] { hig, left, count + 1 });
}
}
if (up >= 0) {
System.out.println("위쪽전진: " + up + "," + wid);
String flg = map[up][wid];
System.out.println("전진값: " + flg);
if (!flg.equals( "X") && !visited[up][wid]) {
System.out.println("O이므로 위치 저장가능");
visited[up][wid] = true;
printvisit(visited);
queue.offer(new Integer[] { up, wid, count + 1 });
}
}
if (down <= mh - 1) {
System.out.println("아래쪽전진: " + down + "," + wid);
String flg = map[down][wid];
System.out.println("전진값: " + flg);
if (!flg.equals( "X") && !visited[down][wid]) {
System.out.println("O이므로 위치 저장가능");
visited[down][wid] = true;
printvisit(visited);
queue.offer(new Integer[] { down, wid, count + 1 });
}
}
}
if (!arrive) {
return -1;
}
return re;
}
public static void printvisit(boolean[][] visited) {
System.out.println("visited 생성 시작");
for (int i = 0; i < visited.length; i++) {
for (int ii = 0; ii < visited[i].length; ii++) {
System.out.print(visited[i][ii] + " ");
}
System.out.println();
}
System.out.println("visited 생성 종료");
}