๐ ๋ฌธ์
https://www.acmicpc.net/problem/1261
๋ฌธ์
์๊ณ ์คํ ์ด์์ง์ด ๋ชจ๋ ๋ฏธ๋ก์ ๊ฐํ๋ค. ๋ฏธ๋ก๋ N*M ํฌ๊ธฐ์ด๋ฉฐ, ์ด 1*1ํฌ๊ธฐ์ ๋ฐฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ฏธ๋ก๋ ๋น ๋ฐฉ ๋๋ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๋น ๋ฐฉ์ ์์ ๋กญ๊ฒ ๋ค๋ ์ ์์ง๋ง, ๋ฒฝ์ ๋ถ์์ง ์์ผ๋ฉด ์ด๋ํ ์ ์๋ค.
์๊ณ ์คํ ์ด์์ง์ ์ฌ๋ฌ๋ช ์ด์ง๋ง, ํญ์ ๋ชจ๋ ๊ฐ์ ๋ฐฉ์ ์์ด์ผ ํ๋ค. ์ฆ, ์ฌ๋ฌ ๋ช ์ด ๋ค๋ฅธ ๋ฐฉ์ ์์ ์๋ ์๋ค. ์ด๋ค ๋ฐฉ์์ ์ด๋ํ ์ ์๋ ๋ฐฉ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ๋ฐฉ์ด๋ค. ์ฆ, ํ์ฌ ์ด์์ง์ด (x, y)์ ์์ ๋, ์ด๋ํ ์ ์๋ ๋ฐฉ์ (x+1, y), (x, y+1), (x-1, y), (x, y-1) ์ด๋ค. ๋จ, ๋ฏธ๋ก์ ๋ฐ์ผ๋ก ์ด๋ ํ ์๋ ์๋ค.
๋ฒฝ์ ํ์์๋ ์ด๋ํ ์ ์์ง๋ง, ์๊ณ ์คํ์ ๋ฌด๊ธฐ AOJ๋ฅผ ์ด์ฉํด ๋ฒฝ์ ๋ถ์์ด ๋ฒ๋ฆด ์ ์๋ค. ๋ฒฝ์ ๋ถ์๋ฉด, ๋น ๋ฐฉ๊ณผ ๋์ผํ ๋ฐฉ์ผ๋ก ๋ณํ๋ค.
๋ง์ฝ ์ด ๋ฌธ์ ๊ฐ ์๊ณ ์คํ์ ์๋ค๋ฉด, ์ด์์ง๋ค์ ๊ถ๊ทน์ ๋ฌด๊ธฐ sudo๋ฅผ ์ด์ฉํด ๋ฒฝ์ ํ ๋ฒ์ ๋ค ์์ ๋ฒ๋ฆด ์ ์์ง๋ง, ์ํ๊น๊ฒ๋ ์ด ๋ฌธ์ ๋ Baekjoon Online Judge์ ์๋ก๋์ด ์๊ธฐ ๋๋ฌธ์, sudo๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํ์ฌ (1, 1)์ ์๋ ์๊ณ ์คํ ์ด์์ง์ด (N, M)์ผ๋ก ์ด๋ํ๋ ค๋ฉด ๋ฒฝ์ ์ต์ ๋ช ๊ฐ ๋ถ์์ด์ผ ํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฏธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๊ฐ๋ก ํฌ๊ธฐ M, ์ธ๋ก ํฌ๊ธฐ N (1 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๋ฏธ๋ก์ ์ํ๋ฅผ ๋ํ๋ด๋ ์ซ์ 0๊ณผ 1์ด ์ฃผ์ด์ง๋ค. 0์ ๋น ๋ฐฉ์ ์๋ฏธํ๊ณ , 1์ ๋ฒฝ์ ์๋ฏธํ๋ค.
(1, 1)๊ณผ (N, M)์ ํญ์ ๋ซ๋ ค์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์๊ณ ์คํ ์ด์์ง์ด (N, M)์ผ๋ก ์ด๋ํ๊ธฐ ์ํด ๋ฒฝ์ ์ต์ ๋ช ๊ฐ ๋ถ์์ด์ผ ํ๋์ง ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
๐ก BFS ์ฝ๋์์ ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ต์ ๊ฐ์ค์น๋ฅผ ์ฐพ์ ๊ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ์ ๊ฐ๋ ์ด ๋๋ค.
โป๏ธ ์ฐ์ ์์ํ์ ์์ ์์น๋ฅผ ์ ๋ ฅํ ํ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ ๋ฐฐ์ด์ ๋ค๊ณ BFS ํ์์ ์์ํ๋ค.
โป๏ธ "๋ฒฝ์ ๋ถ์ ํ์"๊ฐ ์ต์์ธ ์์น๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์์ ํ๋ค.
โป๏ธ ์๋ก์ด ์์น์ ๋ฒฝ์ด ์์ผ๋ฉด ๋ฒฝ์ ๋ถ์ ํ์๋ฅผ +1 ํด์ฃผ๊ณ , ์๋๋ฉด ๊ทธ๋ฅ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ง ํด์ ๋ค์ ํ์ ๋ฃ๋๋ค.
โป๏ธ ๋ชฉํ ์์น๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ํ์์ ์ข ๋ฃํ๋ค. (๋ฒฝ์ ์ต์๋ก ๋ถ์ ํ์๋ก ๋ฐ๊ฒฌ์ด ๋ ๊ฒ์ด๋ฏ๋ก)
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
/** https://www.acmicpc.net/problem/1261 */
// ๋ค์ต์คํธ๋ผ, BFS
// ๋ฒฝ์ ์ต์๋ก ๋ถ์๋ฉฐ ์ด๋ -> ๋ค์ต์คํธ๋ผ์์ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ(๋ฒฝ์ ๋ถ์ ํ์)๋ฅผ ์ฐพ์๊ฐ๋ ๊ฒ
public class Main_๋ฐฑ์ค_1261_์๊ณ ์คํ_๊ณจ๋4 {
static int N, M, result;
static int[][] map;
static boolean[][] visited;
static int[] dr = {1,-1,0,0};
static int[] dc = {0,0,1,-1};
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());//๊ฐ๋ก
N = Integer.parseInt(st.nextToken());//์ธ๋ก
map = new int[N+1][M+1];
visited = new boolean[N+1][M+1];
for (int i = 1; i <= N; i++) {
String str = br.readLine();
for (int j = 1; j <= M; j++) {
map[i][j] = str.charAt(j-1) - '0';
}
}//input
bfs();
System.out.println(result);
}//end of main
private static void bfs() {
visited[1][1] = true;
// ๋ฒฝ์ ๋ถ์ ํ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ์ ์์ํ ์ค์
PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->(a[2]-b[2]));
queue.offer(new int[] {1,1,0});//(r,c,d)
int r, c, d, nr, nc, nd;
while(queue.size()>0) {
int[] cur = queue.poll();
r = cur[0];
c = cur[1];
d = cur[2];
if(r==N && c==M) {
result = d;
break;
}
for (int i = 0; i < 4; i++) {
nr = r + dr[i];
nc = c + dc[i];
nd = d;
if(nr>N||nc>M||nr<1||nc<1||visited[nr][nc]) continue;
if(map[nr][nc]==1) nd++;
visited[nr][nc] = true;
queue.offer(new int[] {nr,nc,nd});
}
}
}//end of bfs
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ