728x90

www.acmicpc.net/problem/16236

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net

BFS로 풀었다. 주의할 것은

거리가 가까운 물고기가 많다면, 가장 위에 있는 물고기, 그러한 물고기가 여러마리라면, 가장 왼쪽에 있는 물고기를 먹는다.

이 조건이다.

따라서 BFS로 탐색을 하다가 최단 거리로 이동할 수 있는 칸을 발견한다고 바로 거기로 이동하면 안 된다.

그 최단거리로 이동할 수 있는 칸들을 temp에 저장해주고 행, 열을 기준으로 오름차순 정렬을 하여 첫 번째 원소로 이동하도록 하였다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <tuple>
using namespace std;

int dx[4] = { -1, 0, 0, 1 };
int dy[4] = { 0, -1, 1, 0 };

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	int n, row, col, size;
	cin >> n;
	vector<vector<int>> v(n, vector<int>(n));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> v[i][j];
			if (v[i][j] == 9) {
				row = i;
				col = j;
				v[i][j] = 0;
			}
		}
	}
	size = 2;
	int cnt = 0;
	int totalSecond = 0;
	while (true) {
		queue<tuple<int, int, int>> q;
		vector<vector<bool>> visited(n, vector<bool>(n, false));
		q.push(make_tuple(row, col, 0));
		int minDistance = 100000;
		vector<pair<int, int>> temp;
		while (!q.empty()) {
			tuple<int, int, int> cur = q.front();
			q.pop();
			if (v[get<0>(cur)][get<1>(cur)] > 0 && v[get<0>(cur)][get<1>(cur)] < size && get<2>(cur) <= minDistance) {
				minDistance = get<2>(cur);
				temp.push_back(make_pair(get<0>(cur), get<1>(cur)));
			}
			if (!visited[get<0>(cur)][get<1>(cur)] && get<2>(cur) <= minDistance) {
				visited[get<0>(cur)][get<1>(cur)] = true;
				for (int i = 0; i < 4; i++) {
					int r = get<0>(cur) + dx[i];
					int c = get<1>(cur) + dy[i];
					int time = get<2>(cur);
					if (r >= 0 && r < n && c >= 0 && c < n) {
						if (v[r][c] <= size) {
							q.push(make_tuple(r, c, time + 1));
						}
					}
				}
			}
		}
		sort(temp.begin(), temp.end());
		if (temp.size() == 0) {
			break;
		}
		else {
			row = temp[0].first;
			col = temp[0].second;
			totalSecond += minDistance;
			cnt++;
			if (cnt == size) {
				size++;
				cnt = 0;
			}
			v[row][col] = 0;
		}
	}
	cout << totalSecond;
	return 0;
}

www.acmicpc.net/problem/16236

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net

 

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2573번 빙산  (0) 2021.01.21
[백준] 2146번 다리 만들기  (0) 2021.01.21
[백준] 13460번 구슬 탈출 2  (0) 2021.01.20
[백준] 2458번 키 순서  (0) 2021.01.19
[백준] 16234번 인구 이동  (0) 2021.01.18

+ Recent posts