ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [๋ฐฑ์ค€(BOJ) 4179๋ฒˆ] ๋ถˆ! (C++)
    PS(Problem Solving)/C++ 2022. 1. 30. 14:23
    ๋ฐ˜์‘ํ˜•

    ๋ฌธ์ œ ๋งํฌ

    https://www.acmicpc.net/problem/4179

     

    ๋ฌธ์ œ ์ •๋ณด

    ์ž…๋ ฅ

    ์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ์ •์ˆ˜ R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 1 ≤ R, C ≤ 1000 ์ด๋‹ค. R์€ ๋ฏธ๋กœ ํ–‰์˜ ๊ฐœ์ˆ˜, C๋Š” ์—ด์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

    ๋‹ค์Œ ์ž…๋ ฅ์œผ๋กœ R์ค„๋™์•ˆ ๊ฐ๊ฐ์˜ ๋ฏธ๋กœ ํ–‰์ด ์ฃผ์–ด์ง„๋‹ค.

     ๊ฐ๊ฐ์˜ ๋ฌธ์ž๋“ค์€ ๋‹ค์Œ์„ ๋œปํ•œ๋‹ค.

    • #: ๋ฒฝ
    • .: ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„
    • J: ์ง€ํ›ˆ์ด์˜ ๋ฏธ๋กœ์—์„œ์˜ ์ดˆ๊ธฐ์œ„์น˜ (์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„)
    • F: ๋ถˆ์ด ๋‚œ ๊ณต๊ฐ„

    J๋Š” ์ž…๋ ฅ์—์„œ ํ•˜๋‚˜๋งŒ ์ฃผ์–ด์ง„๋‹ค.

    ์ถœ๋ ฅ

    ์ง€ํ›ˆ์ด๊ฐ€ ๋ถˆ์ด ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ IMPOSSIBLE ์„ ์ถœ๋ ฅํ•œ๋‹ค.

    ์ง€ํ›ˆ์ด๊ฐ€ ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ํƒˆ์ถœ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. 

     

    ํ’€์ด

     ์ด ๋ฌธ์ œ๋Š” BFS์˜ ์‘์šฉ ๋ฌธ์ œ๋กœ ์‹œ์ž‘์ ์ด ๋‘ ์ข…๋ฅ˜์ผ ๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์‹œ์ž‘์ ์ด ๋‘ ์ข…๋ฅ˜์ผ ๊ฒฝ์šฐ์— ๋ถˆ์— ๋Œ€ํ•œ BFS์™€ ์ง€ํ›ˆ์ด์— ๋Œ€ํ•œ BFS๋ฅผ ๋‘˜ ๋‹ค ๋Œ๋ ค์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ์†Œ์Šค ์ฝ”๋“œ

    #include <bits/stdc++.h>
    using namespace std;
    
    #define X first
    #define Y second
    
    string board[1002];
    int dist1[1002][1002]; // ๋ถˆ์˜ ์ „ํŒŒ ์‹œ๊ฐ„์„ ์ €์žฅํ•œ ๋ฐฐ์—ด
    int dist2[1002][1002]; // ์ง€ํ›ˆ์ด์˜ ์ด๋™ ์‹œ๊ฐ„์„ ์ €์žฅํ•œ ๋ฐฐ์—ด
    int r, c;
    int dx[4] = { 1, 0, -1, 0 };
    int dy[4] = { 0, 1, 0, -1 }; 
    
    int main(void) {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	
    	cin >> r >> c;
    	for (int i = 0; i < r; i++) {
    		fill(dist1[i], dist1[i] + c, -1); // ๋ฐฐ์—ด์„ ๋ฏธ๋ฆฌ -1๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋‘๋ฉด vis ๋ฐฐ์—ด์„ ๋”ฐ๋กœ ๋‘ฌ์„œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!
    		fill(dist2[i], dist2[i] + c, -1); // ๋ฐฐ์—ด์„ ๋ฏธ๋ฆฌ -1๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋‘๋ฉด vis ๋ฐฐ์—ด์„ ๋”ฐ๋กœ ๋‘ฌ์„œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!
    	}
    	
    	for (int i = 0; i < r; i++) {
    		cin >> board[i];
    	}
    	
    	queue<pair<int, int>> Q1; // ๋ถˆ์— ๋Œ€ํ•œ BFS
    	queue<pair<int, int>> Q2; // ์ง€ํ›ˆ์ด์— ๋Œ€ํ•œ BFS
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			if (board[i][j] == 'F') { // ๋ถˆ์˜ ์‹œ์ž‘ ์ขŒํ‘œ
    				Q1.push({i, j});
    				dist1[i][j] = 0;
    			}
    			if (board[i][j] == 'J') { // ์ง€ํ›ˆ์ด์˜ ์‹œ์ž‘ ์ขŒํ‘œ
    				Q2.push({i, j});
    				dist2[i][j] = 0;
    			}
    		}
    	}
    	
    	// ๋ถˆ์— ๋Œ€ํ•œ BFS
    	while (!Q1.empty()) {
    		auto cur = Q1.front();
    		Q1.pop();
    		
    		for (int dir = 0; dir < 4; dir++) {
    			int nx = cur.X + dx[dir];
    			int ny = cur.Y + dy[dir];
    			
    			if (nx < 0 || nx >= r || ny < 0 || ny >= c) {
    				continue;
    			}
    			if (dist1[nx][ny] >= 0 || board[nx][ny] == '#') {
    				continue;
    			}
    			
    			dist1[nx][ny] = dist1[cur.X][cur.Y] + 1;
    			Q1.push({nx, ny});
    		}
    	}
    	
    	// ์ง€ํ›ˆ์ด์— ๋Œ€ํ•œ BFS
    	while (!Q2.empty()) {
    		auto cur = Q2.front();
    		Q2.pop();
    		
    		for (int dir = 0; dir < 4; dir++) {
    			int nx = cur.X + dx[dir];
    			int ny = cur.Y + dy[dir];
    			
    			if (nx < 0 || nx >= r || ny < 0 || ny >= c) {
    				// ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๋Š” ๊ฒƒ์€ ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœ ํ–ˆ๋‹ค๋Š” ๊ฒƒ!
    				cout << dist2[cur.X][cur.Y] + 1;
    				return 0;
    			}
    			if (dist2[nx][ny] >= 0 || board[nx][ny] == '#') {
    				continue;
    			}
    			// ๋ถˆ์ด ๋จผ์ € ๋„์ฐฉํ–ˆ์œผ๋ฉด ์ง€ํ›ˆ์ด๋Š” ๋ชป์ง€๋‚˜๊ฐ!
    			if (dist1[nx][ny] != -1 && dist1[nx][ny] <= dist2[cur.X][cur.Y] + 1) {
    				continue;
    			}
    			
    			dist2[nx][ny] = dist2[cur.X][cur.Y] + 1;
    			Q2.push({nx, ny});
    		}
    	}
    	
    	cout << "IMPOSSIBLE";
    	
    	return 0;
    }

     

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.