<문제 링크>
https://www.acmicpc.net/problem/5427
<내 소스>
iimport java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
class Main {
static int t,n,m,ans, mx[] = {-1,0,1,0}, my[] = {0,1,0,-1};
static char[][] map;
static boolean escape;
static Queue<Position> start = new LinkedList<>();
static Queue<Position> fire = new LinkedList<>();
static Queue<Position> tmp = new LinkedList<>();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine());
for (int i=0; i<t; i++) {
String[] b = br.readLine().split(" ");
n = Integer.parseInt(b[0]);
m = Integer.parseInt(b[1]);
map = new char[m][n];
for (int j=0; j<m; j++) {
String a = br.readLine();
for (int k=0; k<n; k++) {
map[j][k] = a.charAt(k);
if (map[j][k] == '@')
start.add(new Position(j,k,1)); // 상근이 넣어준다
if (map[j][k] == '*')
fire.add(new Position(j,k)); // 불들을 넣어준다
}
} //입력
a:while(!start.isEmpty()) { // 상근이가 이동할 수 없을 때까지
while(!fire.isEmpty()) {
Position f = fire.poll();
for (int j=0; j<4; j++) {
int x = f.x + mx[j];
int y = f.y + my[j];
if (0<=x && x<m && 0<=y && y<n && map[x][y] == '.') {
map[x][y] = '*';
tmp.add(new Position(x,y));
}
}
} // 불을 먼저 퍼뜨린다.
fire.addAll(tmp);
tmp.clear();
while(!start.isEmpty()) {
Position s = start.poll();
if ((s.x==0 && 0<=s.y && s.y<n) || (s.y==n-1 && 0<=s.x && s.x<m) || (s.x==m-1 && 0<=s.y && s.y<n)
|| (s.y==0 && 0<=s.x && s.x<m) ) {// 탈출 성공시
escape = true; // 탈출 성공
ans = s.edge; // 상근이 걸음수 대입
fire.clear();
start.clear();
tmp.clear(); // 다음 테스트를 위해 큐 비움
break a;
}
for (int j=0; j<4; j++) {
int x = s.x + mx[j];
int y = s.y + my[j];
if (0<=x && x<m && 0<=y && y<n && map[x][y] == '.') {
map[x][y] = 's';
tmp.add(new Position(x,y,s.edge+1));
}
}
} //상근이 이동
start.addAll(tmp);
tmp.clear();
}
if (escape)
System.out.println(ans);
else
System.out.println("IMPOSSIBLE");
escape = false;
}
}
}
class Position {
int x,y,edge;
Position (int x, int y) {
this.x = x;
this.y = y;
}
Position (int x, int y, int edge) {
this.x = x;
this.y = y;
this.edge = edge;
}
}
1
1 1
@
같이 애초에 상근이가 탈출 위치에 있을 때도 1 뜨고 다른 케이스도 다 맞게 뜨는데
50%에서 자꾸 틀린다... 왜 그런 걸까?
900문제나 풀었으면서 이거하나 못푸노 ;;
ps갤로
50에서 자꾸 틀림. 예외 케이스를 모르겠네. 그리고 들여쓰기 왤케 개판으로 나오냐;
@이거 하나 있을때 고려했음?
ㄴ 본문에 써놨잖아 ㅠㅠ 그것도 1로 답 잘 나옴
걍 그거아님? 불옆에 바로 @있으면 처리안되는 문제 불이 @ 덮어 씌워버리니깐 @가 사라질듯
않이 ps뒂다 모하누
PS는 뭔데 썅 ㅡㅡ
182.224/ @가 사라져도 상관 없는 게 어차피 큐에 상근이 위치 들어가있고 불퍼진 다음, 상근이가 갈 수 있는 곳으로 탐색하게 돼있음
상근이? 개이름같다 ㅋㅋ 열심히해보세염!!
아아쒸벌 디시는 마크다운 지원안해주냐 코드 보기 줮같네