ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€(BOJ) 7576번] ν† λ§ˆν†  (C++)
    PS(Problem Solving)/C++ 2022. 1. 23. 23:35
    λ°˜μ‘ν˜•

    문제 링크

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

     

    문제 정보

    μž…λ ₯

    첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 주어진닀. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 주어진닀. ν•˜λ‚˜μ˜ μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ 주어진닀. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€.

    ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

    좜λ ₯

    μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

     

    풀이

     μ΄ λ¬Έμ œλŠ” BFS의 μ‘μš© 문제둜 μ‹œμž‘μ μ΄ μ—¬λŸ¬ 개일 λ•Œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법이닀. μ‹œμž‘μ μ„ λͺ¨λ‘ 큐에 넣어버리고 BFSλ₯Ό λŒλ €μ„œ ν•΄κ²°ν•œλ‹€!

     

    μ†ŒμŠ€ μ½”λ“œ

    #include <bits/stdc++.h>
    using namespace std;
    
    #define X first
    #define Y second
    
    int board[1002][1002];
    int dist[1002][1002]; // 읡은 λ‚ μ§œ μ €μž₯ν•  λ°°μ—΄
    int n, m;
    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 >> m >> n;
    	
    	queue<pair<int, int>> Q;
    	
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			cin >> board[i][j];
    			
    			if (board[i][j] == 1) {
    				Q.push({i, j}); // 읡은 ν† λ§ˆν† (μ‹œμž‘ μ’Œν‘œ)λ₯Ό 큐에 넣어버린닀.
    			}
    			
    			if (board[i][j] == 0) {
    				dist[i][j] = -1; // 읡지 μ•Šμ€ ν† λ§ˆν† μ˜ 읡은 λ‚ μ§œλ₯Ό -1둜 μ €μž₯ν•œλ‹€. (읡은 ν† λ§ˆν† μ™€ ν† λ§ˆν† κ°€ μ—†λŠ” 칸은 0으둜 μ΄ˆκΈ°ν™” λ˜μ–΄ 있음!)
    			}
    		}
    	}
    	
    	while (!Q.empty()) {
    		auto cur = Q.front();
    		Q.pop();
    		
    		for (int dir = 0; dir < 4; dir++) {
    			int nx = cur.X + dx[dir];
    			int ny = cur.Y + dy[dir];
    			
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
    				continue;
    			}
    			if (dist[nx][ny] >= 0) {
    				continue; // 읡은 ν† λ§ˆν† , ν† λ§ˆν† κ°€ μ—†λŠ” μΉΈ
    			}
    			
    			dist[nx][ny] = dist[cur.X][cur.Y] + 1;
    			Q.push({nx, ny});
    		}
    	}
    	
    	int ans = 0;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			if (dist[i][j] == -1) {
    				cout << "-1";
    				return 0;
    			}
    			ans = max(ans, dist[i][j]);
    		}
    	}
    	
    	cout << ans;
    	
    	return 0;
    }

     

    λ°˜μ‘ν˜•
Designed by Tistory.