λ°±μ€ 14442λ² : λ²½ λΆμκ³ μ΄λνκΈ°2
https://www.acmicpc.net/problem/14442
14442λ²: λ²½ λΆμκ³ μ΄λνκΈ° 2
첫째 μ€μ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)μ΄ μ£Όμ΄μ§λ€. λ€μ Nκ°μ μ€μ Mκ°μ μ«μλ‘ λ§΅μ΄ μ£Όμ΄μ§λ€. (1, 1)κ³Ό (N, M)μ νμ 0μ΄λΌκ³ κ°μ νμ.
www.acmicpc.net
λ¬Έμ
- N×Mμ νλ ¬λ‘ ννλλ λ§΅μ΄ μλ€. λ§΅μμ 0μ μ΄λν μ μλ κ³³, 1μ λ²½μ΄ μλ κ³³μ λνλΈλ€.
- (1, 1)μμ (N, M)μ μμΉκΉμ§ μ΄λνλ € νλλ°, μ΅λ¨ κ²½λ‘λ‘ μ΄λνλ € νλ€.
- ν μΉΈμμ μ΄λν μ μλ μΉΈμ μνμ’μ°λ‘ μΈμ ν μΉΈ
- ν κ°μ λ²½μ λΆμκ³ μ΄λνλ κ²μ΄ μ’ λ κ²½λ‘κ° μ§§μμ§λ€λ©΄, λ²½μ Kκ° κΉμ§ λΆμκ³ μ΄λνμ¬λ λλ€.
- 첫째 μ€μ μ΅λ¨ 거리λ₯Ό μΆλ ₯νλ€. λΆκ°λ₯ν λλ -1μ μΆλ ₯νλ€.
νμ΄
λ²½ λΆμκ³ μ΄λνκΈ° μ리μ¦μ λ¬Έμ μ΄λ€. 1μμλ λ²½μ ν κ° κΉμ§ λΆμκ³ μ΄λνμ§λ§, μ΄ λ¬Έμ μμλ Kκ°κΉμ§ λΆμκ³ μ΄λνλ€.
https://www.acmicpc.net/problem/2206
2206λ²: λ²½ λΆμκ³ μ΄λνκΈ°
N×Mμ νλ ¬λ‘ ννλλ λ§΅μ΄ μλ€. λ§΅μμ 0μ μ΄λν μ μλ κ³³μ λνλ΄κ³ , 1μ μ΄λν μ μλ λ²½μ΄ μλ κ³³μ λνλΈλ€. λΉμ μ (1, 1)μμ (N, M)μ μμΉκΉμ§ μ΄λνλ € νλλ°, μ΄λ μ΅λ¨ κ²½λ‘
www.acmicpc.net
κ·Έλμ λ²½ λΆμκ³ μ΄λνκΈ°μ λ¬Έμ νμ΄μ μ μ¬νλ€.
https://programmingiraffe.tistory.com/145
λ°±μ€ - 2206λ² : λ²½λΆμκ³ μ΄λνκΈ°
https://www.acmicpc.net/problem/2206 2206λ²: λ²½ λΆμκ³ μ΄λνκΈ° N×Mμ νλ ¬λ‘ ννλλ λ§΅μ΄ μλ€. λ§΅μμ 0μ μ΄λν μ μλ κ³³μ λνλ΄κ³ , 1μ μ΄λν μ μλ λ²½μ΄ μλ κ³³μ λνλΈλ€. λΉμ μ (1, 1)μ
programmingiraffe.tistory.com
μνμ’μ° μΈμ ν μΉΈμΌλ‘ ν μΉΈμ© μ΄λνμ λμ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνλ λ¬Έμ λ‘, ν μΉΈμ© μ΄λνλ©° μ¬λ°©νμμ ν΅ν΄ λͺ¨λ κ²½μ°μ μμ λν΄ μ΄νΌκ³ λͺ©ν μ§μ μ λλ¬νμμ νμμ μ’ λ£ν΄μΌ νλ€. λ°λΌμ νλ₯Ό μ΄μ©ν BFS μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ¬Έμ λ₯Ό νμλ€.
1. λ²½μ μ§κΈκΉμ§ λͺ κ° λΆμλμ§ μ 보 μ μ₯
νμ μ’ν μ 보λ₯Ό λ£μ λ, νλ ¬ μ’νκ°, μ΄λ 거리λΏλ§ μλλΌ μ§κΈκΉμ§ λͺ κ°μ λ²½μ λΆμμ μ΄ μλμ§ μ 보λ₯Ό μ μ₯ν νμκ° μλ€. λ°λΌμ μ’ν μ 보λ₯Ό λ΄λ PointλΌλ κ°μ²΄μ int νμ λ³μ(hit)μ μΆκ°ν΄μ€¬λ€.
2. λ°©λ¬Έμ²΄ν¬ : boolean[K][N][M]
방문체ν¬λ₯Ό ν λ, ν€λΉ μ§μ μ λν΄ μ§κΈκΉμ§ λ²½μ λͺ λ² λΆμκ³ λ°©λ¬Ένλκ° μνλκ°λ₯Ό νμνλ€. ν΄λΉ μ§μ μ νλ²λ μλΆμκ³ λ°©λ¬Έν μλ μκ³ , 1λ² λΆμκ³ λ°©λ¬Έν μλ μκ³ , .. Kλ² λΆμκ³ λ°©λ¬Έν μλ μκΈ° λλ¬Έμ΄λ€. κ·Έλ¦¬κ³ λ¨Όμ nλ² λΆμκ³ λ°©λ¬Ένμ΄λ νμ κ·Έ κ²½λ‘κ° λμ΄μ νμμ΄ λΆκ°λ₯ν κ²½λ‘κ° λ μλ μλ€.
* λ°±μ€μ λ¬Έμ λ΄ κ²μνμμ 본건λ°, λ°°μ΄μ μ°¨μ μ μΈ μμκ° λ©λͺ¨λ¦¬μ μνμκ°μ μν₯μ λ―ΈμΉλ€κ³ νλ€.
(https://www.acmicpc.net/board/view/111938)
visited[11][1000][1000]κ° visited[1000][1000][11] λ³΄λ€ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ ν¨μ¬ μ λ€. μ±μ μ λλ Έμ λλ 500ms μ λ μ°¨μ΄κ° λ¬λ€.
3. λ²½μΈμ§ λ²½μ΄ μλμ§μ λ°λΌ νμμ λ€λ₯΄κ² νλ€.
- λ²½μ΄ μλλ€
- μ§κΈκΉμ§ nκ° λΆμ΄ λ°©λ¬Ένμ μ΄ μμ => nκ° κ·Έλλ‘ νμ
- λ²½μ΄λ€
- μ§κΈκΉμ§ Kκ° λ―Έλ§ λΆμ¨
- μ§κΈκΉμ§ n +1κ° λΆμ΄ λ°©λ¬Ένμ μ΄ μμ=> n+1 λΆμκ³ νμ
μ½λ
import java.io.*;
import java.util.*;
public class Main {
static int N, M, K;
static int[][] graph;
static boolean[][][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Point {
int x;
int y;
int count;
int hit;
public Point(int x, int y, int count, int hit) {
this.x = x;
this.y = y;
this.count = count;
this.hit = hit;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
graph = new int[N + 1][M + 1];
visited = new boolean[K + 1][N + 1][M + 1]; //0 : λ²½ μλΆμ¨, 1~K: λ²½ nκ° λΆμ¨
for(int i = 1; i <= N; i++) {
String row = br.readLine();
for(int j = 1; j <= M; j++) {
graph[i][j] = row.charAt(j - 1) - '0';
}
}
int answer = bfs(1, 1);
System.out.println(answer);
}
public static int bfs(int i, int j) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(i, j, 1, 0));
visited[0][i][j] = true;
while(!queue.isEmpty()) {
Point point = queue.poll();
if(point.x == N && point.y == M) { // μ’
λ£ μ‘°κ±΄
return point.count;
}
for(int d = 0; d < 4; d++) {
int nx = point.x + dx[d];
int ny = point.y + dy[d];
if(1 <= nx && nx <= N && 1 <= ny && ny <= M) {
if(graph[nx][ny] == 0 && !visited[point.hit][nx][ny]) { //λ²½ μλ
queue.add(new Point(nx, ny, point.count + 1, point.hit));
visited[point.hit][nx][ny] = true;
}else if(graph[nx][ny] == 1 && point.hit < K && !visited[point.hit + 1][nx][ny]) { //λ²½ μμ, kκ° λ―Έλ§ λΆμ¨, n+1λΆμκ³ λ°©λ¬Ένμ μμ
queue.add(new Point(nx, ny, point.count + 1, point.hit + 1)); //λ²½ λΆμκΈ°
visited[point.hit + 1][nx][ny] = true;
}
}
}
}
return -1;
}
}
κ²°κ³Ό

1480ms 걸리λ κ²°κ³Ό : visited[11][1000][1000]
1992ms 걸리λ κ²°κ³Ό : visited[1000][1000][11]
λ°°μ΄μ
- 3μ°¨μ 방문체ν¬
- visited[11][1000][1000] κ° visited[1000][1000][11] λ³΄λ€ μκ°μ΄ μ κ² λ λ€