(c++) 16236 ์•„๊ธฐ์ƒ์–ด๐Ÿฆˆ

์ด์•„๋ฆ„ยท2022๋…„ 8์›” 19์ผ
0

์ฝ”๋”ฉํ…Œ์ŠคํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
2/6
post-thumbnail

16236 ์•„๊ธฐ์ƒ์–ด ๐Ÿฆˆ

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

๊ฐœ์ธ์ ์œผ๋กœ ๋งŽ์ด ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ!
-> ์•Œ๊ณ ๋ณด๋‹ˆ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ฌธ์ œ..

  • ํ˜„์žฌ ์ƒ์–ด ์œ„์น˜์—์„œ๋ถ€ํ„ฐ ๋ฌผ๊ณ ๊ธฐ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค
    • ๋‹จ, ์ƒ์–ด๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๋Š” ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค.
  • ๊ฐ€์žฅ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋“ค์„ ๊ณ ๋ฅธ๋‹ค.
    • 0๋ณด๋‹ค ํฌ๊ณ  ์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค๋Š” ์ž‘์•„์•ผํ•œ๋‹ค.
  • ๊ณ ๋ฅธ ๋ฌผ๊ณ ๊ธฐ ์ค‘ ๊ฐ€์žฅ ์œ„์ชฝ์— ์žˆ๋Š”(๊ฐ™์œผ๋ฉด ์™ผ์ชฝ์— ์žˆ๋Š”) ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ณจ๋ผ์„œ ๋จน๋Š”๋‹ค.
    • ํ˜„์žฌ ์ƒ์–ด์˜ ์œ„์น˜๋Š” 0์œผ๋กœ ํ•˜๊ณ  ๋จน์„ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜์— ์ƒ์–ด(9)๋ฅผ ๋‘”๋‹ค.
    • ์ƒ์–ด๊ฐ€ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ๋งŒ์•ฝ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๊ฐ€ ์ƒ์–ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™๋‹ค๋ฉด ์ƒ์–ด์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    • ๊ณ ๋ฅธ ๋ฌผ๊ณ ๊ธฐ์™€ ์ƒ์–ด ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋งŒํผ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๋‚˜๋Š” ์œ„ ๋กœ์ง์„ ๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์„๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์‹œ์ผœ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

2%์—์„œ ์ž๊พธ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์„œ ์™œ์ธ์ง€ ์•Œ์•„๋ณด๋‹ˆ ์ƒ์–ดํฌ๊ธฐ๊ฐ€ 9 ์ด์ƒ์ด ๋˜๋ฉด ๋ฌดํ•œ๋ฃจํ”„์— ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ 76์งธ ์ค„์— ์ƒ์–ด ํฌ๊ธฐ๊ฐ€ 7 ์ด์ƒ ๋˜์ง€ ์•Š๋„๋ก ์ถ”๊ฐ€ํ–ˆ๋‹ค.


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

int N;
void initVisited(vector<vector<bool>> &visited) {
	visited.clear();
	for (int i = 0; i < N; i++) {
		vector<bool> tmp(N,false);
		visited.push_back(tmp);
	}
}

int main() {
	 cin >> N;
	vector<vector<int>> sea(N);
	pair<int, int> shark; //์ƒ์–ด ์œ„์น˜
	for (int i = 0; i < N; i++) { //์ž…๋ ฅ
		for (int k = 0; k < N; k++) {
			int input; cin >> input;
			sea[i].push_back(input);
			if (input == 9) {
				shark = { i,k };
			}
		}
	}
	int sharkSize = 2; //์ƒ์–ด ํฌ๊ธฐ
	int eated = 0; //๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜
	int totalTime = 0;
	int dx[] = { 0,1,0,-1 };
	int dy[] = { -1,0,1,0 };
	vector<vector<int>> canEat; //๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ
	do {
		canEat.clear();
		int minDist = 5000; //canEat์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ
		queue<vector<int>> q; //x,y,๊ฑฐ๋ฆฌ
		vector<vector<bool>> visited(N, vector<bool>(N, false));
		q.push({ shark.first,shark.second,0 });
		visited[shark.first][shark.second] = true;
		while (!q.empty()) {
			vector<int> now = q.front(); q.pop();
			if (now[2] > minDist) continue;
			if (0 < sea[now[0]][now[1]] && sea[now[0]][now[1]] < sharkSize) {
				if (now[2] < minDist) {
					minDist = now[2];
					canEat.clear();
					canEat.push_back(now);
				}
				else if (now[2] == minDist) {
					canEat.push_back(now);
				}
			}
			for (int i = 0; i < 4; i++) {
				int xx = now[0] + dx[i];
				int yy = now[1] + dy[i];
				if (0 <= xx && xx < N && 0 <= yy && yy < N && !visited[xx][yy]) {
					if (sea[xx][yy] <= sharkSize) {
						visited[xx][yy] = true;
						q.push({ xx,yy,now[2] + 1 });
					}
				}
			}
		}
		if (canEat.size() > 0) {
			sort(canEat.begin(), canEat.end());
			vector<int> togo = canEat[0];
			sea[shark.first][shark.second] = 0;
			sea[togo[0]][togo[1]] = 9;
			shark = { togo[0],togo[1] };
			totalTime += togo[2];
			eated++;
			if (eated == sharkSize) {
				sharkSize++;
				if (sharkSize >= 7) {
					sharkSize = 7;
				}
				eated = 0;
			}
		}
	} while (!canEat.empty());
	cout << totalTime << endl;
	return 0;
}

profile
๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€