int[] answer = {};
String[][] map = new String[maps.length][maps[0].length()];
List<Integer[]> starts = new LinkedList<>();
int landc=0;
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("X")) {
starts.add(new Integer[] { i, j });
landc+=1;
}
}
}
if(landc==0){
return new int[]{-1};
}
Arrays.stream(map).forEach(row -> System.out.println(Arrays.toString(row)));
System.out.println("starts: " +
starts.stream()
.map(Arrays::toString)
.toList());
List<Integer[]> road = new LinkedList<>();
List<Integer>foods=new LinkedList<>();
for (Integer[] start : starts) {
boolean exists = road.stream()
.anyMatch(r -> r[0].equals(start[0]) && r[1].equals(start[1]));
if (exists) {
System.out.println("이미다녀온경로");
continue;
}
int re= bfs(start, map, road);
System.out.println("식량총합: "+re);
foods.add(re);
}
Collections.sort(foods);
System.out.println(foods);
answer = foods.stream()
.mapToInt(Integer::intValue)
.toArray();
return answer;
}
public static int bfs(Integer[] start, String[][] map, List<Integer[]> road) {
int re = 0;
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], Integer.parseInt(map[start[0]][start[1]])});
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];
re += Integer.parseInt(map[hig][wid]);
System.out.println("현재좌표: " + hig + "," + wid+"식량합: "+re);
if (wid == mw && hig == mh) {
System.out.println("끝에도착");
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이므로 위치 저장가능");
road.add(new Integer[] { hig, right });
visited[hig][right] = true;
printvisit(visited);
queue.offer(new Integer[] { hig, right, re });
}
}
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이므로 위치 저장가능");
road.add(new Integer[] { hig, left });
visited[hig][left] = true;
printvisit(visited);
queue.offer(new Integer[] { hig, left, re });
}
}
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이므로 위치 저장가능");
road.add(new Integer[] { up, wid });
visited[up][wid] = true;
printvisit(visited);
queue.offer(new Integer[] { up, wid,re });
}
}
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]) {
road.add(new Integer[] { down, wid });
System.out.println("O이므로 위치 저장가능");
visited[down][wid] = true;
printvisit(visited);
queue.offer(new Integer[] { down, wid,re });
}
}
}
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 생성 종료");
}