• BOJ3055/ C++

    2022. 1. 26.

    by. 내이름은 킹햄찌

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

     

    3055번: 탈출

    사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

    www.acmicpc.net

    백준 온라인저지 3055번 문제입니다. 

    BFS을 이용해서 풀었습니다.

    #include<iostream>
    #include<queue>
    #define MAX 51
    using namespace std;
    
    char arr[MAX][MAX];
    bool visited[MAX][MAX];
    int n, m;
    
    int dx[4] = { 0,0,1,-1 };
    int dy[4] = { 1,-1,0,0 };
    int end_x, end_y = 0;
    queue<pair<int, int>>s_q;
    queue<pair<int, int>>water_q;
    
    void Input() {
    	cin >> n >> m;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			cin >> arr[i][j];
    			if (arr[i][j] == 'S') s_q.push({ i,j });
    			else if (arr[i][j] == '*') water_q.push({ i,j });
    		
    		}
    	}
    }
    
    void solution() {
    	int cnt = 0;
    	while (!s_q.empty()) {
    		int water_qsize = water_q.size();
    		int s_qsize = s_q.size();
    		while (water_qsize--) {
    			int water_y = water_q.front().first;
    			int water_x = water_q.front().second;
    			water_q.pop();
    			for (int i = 0; i < 4; i++) {
    				int move_y = water_y + dy[i];
    				int move_x = water_x + dx[i];
    				if (move_y < 0 || move_y >= n || move_x < 0 || move_x >= m) continue;
    				if (arr[move_y][move_x] == '.') {
    					arr[move_y][move_x] = '*';
    					water_q.push({ move_y ,move_x });
    				}
    			}
    		}
    		cnt++;
    		while (s_qsize--) {
    			int s_y = s_q.front().first;
    			int s_x = s_q.front().second;
    			s_q.pop();
    			visited[s_y][s_x] = true;
    
    			for (int i = 0; i < 4; i++) {
    				int move_y = s_y + dy[i];
    				int move_x = s_x + dx[i];
    				if (move_y < 0 || move_y >= n || move_x < 0 || move_x >= m) continue;
    				if (arr[move_y][move_x] == 'D') {
    					cout << cnt;
    					return;
    				}
    				if (arr[move_y][move_x] == '.' && !visited[move_y][move_x]){
    				
    					visited[move_y][move_x] = true;
    					s_q.push({ move_y ,move_x });
    				}
    				
    			}
    		}
    		
    
    	}
    	cout << "KAKTUS";
    	return;
    }
    
    int main(void) {
    	Input();
    	solution();
    
    	return 0;
    }

    아이디어

    물이 차오르는 지역과 고슴도치의 이동지역을 같이 BFS를 돌려줘야하는데 물이 차오르는 지역이 먼저 수행되어야함

    그리고 같은 시간 대를 보장하기 위해서는 사이클마다 쌓이게 된 큐만 처리해주는것이 포인트

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ1094/ C++  (0) 2022.01.26
    BOJ2098/ C++  (0) 2022.01.26
    BOJ5021/ C++  (0) 2022.01.26
    BOJ2502/ C++  (0) 2022.01.26
    BOJ9470/ C++  (0) 2022.01.26

    댓글