Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 16236.์•„๊ธฐ์ƒ์–ด ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 16236.์•„๊ธฐ์ƒ์–ด

bba_dda 2021. 5. 4. 23:30
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

www.acmicpc.net/problem/16236

 

16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€

www.acmicpc.net

 

ํ’€์ด

์กฐ๊ฑด์ด ๋งค์šฐ! ๋งŽ์€ ๋ฌธ์ œ์˜€๋‹ค. 

BFS๋ฅผ ํ†ตํ•ด์„œ ํ’€์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฑด ์•Œ์•˜์ง€๋งŒ, ๊ณ„์† ์˜ค๋‹ต์ด ๋‚˜์™€์„œ ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. 

 

yulme.tistory.com/92

rile1036.tistory.com/90

 

1. ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ 

  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
    • ๊ฑฐ๋ฆฌ๋Š” ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ง€๋‚˜์•ผํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.
    • ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

--> ์œ„์˜ ์กฐ๊ฑด์„ ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ–ˆ๋‹ค. 

ํ์— ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋„ฃ์œผ๋ฉด, ์•Œ์•„์„œ ์ •๋ ฌํ•ด์„œ ์ œ์ผ ๋จผ์ € ๋จน์–ด์•ผํ•  ๋ฌผ๊ณ ๊ธฐ๋ฅผ top์— ์œ„์น˜์‹œํ‚ค๋„๋ก ํ•จ. 

 

2. Fish ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ

Fish ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ , 

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด compare ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค.  

 

์ฝ”๋“œ

#include<iostream>
#include <vector>
#include <queue>

using namespace std;
int N;
int table[20][20];
bool visited[20][20] = { 0, };
int baby_size = 2;
int move_count = 0;
int eat_count = 0;

int dc[4] = { -1,0,1,0 };
int dr[4] = { 0,-1,0,1 };

struct Fish {
	int dist;
	int r;
	int c;

	//์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”๊ฟ”์คŒ  
	bool operator < (const Fish &f) const {
		if (dist == f.dist) {
			if (r == f.r) {
				return c > f.c; // c๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ 
			}
			else return r > f.r; //r ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ
		}
		else return dist > f.dist; // ๊ฑฐ๋ฆฌ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ 
	}
};
priority_queue<Fish> q;

void BFS() {
	while (!q.empty()) {
		int dist = q.top().dist;
		int c = q.top().c;
		int r = q.top().r;
		q.pop();

		if (table[r][c] > 0 && table[r][c] < baby_size) {
			eat_count++;
			table[r][c] = 0;
			if (baby_size == eat_count) {
				baby_size++;
				eat_count = 0;
			}
			move_count += dist; //์ƒ์–ด๊ฐ€ ์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ธฐ๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ์›€์ง์˜€๋Š”์ง€ ๋”ํ•ด์คŒ

			dist = 0; //์ง€๊ธˆ ์œ„์น˜๋ถ€ํ„ฐ ๋‹ค์‹œ ๋‹ค์Œ ๋ฌผ๊ณ ๊ธฐ๊นŒ์ง€ ๊ฑฐ๋ฆฌ ์žฌ์•ผํ•˜๋‹ˆ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
			fill(&visited[0][0], &visited[19][20],0); //๋ฐฉ๋ฌธ ์ฒดํฌ ์ดˆ๊ธฐํ™” 

			while (!q.empty()) q.pop(); //ํ ๋น„์›Œ์คŒ (์ง€๊ธˆ ์ž๋ฆฌ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ฑ„์›Œ์•ผํ•จ)
		}

		for (int i = 0;i < 4;i++) {
			int new_r = r + dr[i];
			int new_c = c + dc[i];

			//๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋ฉด ํ์— ์•ˆ ๋„ฃ์Œ
			if (new_r < 0 || new_r >= N || new_c < 0 || new_c >= N) continue;
			//์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๋ฉด ์•ˆ ๋„ฃ์Œ
			if (visited[new_r][new_c]) continue;
			// ์•„๊ธฐ ์ƒ์–ด ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ ๋„ฃ์Œ
			if (table[new_r][new_c] > baby_size) continue;

			q.push({ dist + 1,new_r,new_c });
			visited[new_r][new_c] = 1;

		}
	}
}
int main(void) {
	int now_r, now_c;
	cin >> N;
	for (int i = 0;i < N;i++) {
		for (int j = 0;j < N;j++) {
			cin >> table[i][j];
			if (table[i][j] == 9) {
				table[i][j] = 0; //๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
				q.push({ 0,i,j });
			}
		}
	}
	BFS();
	cout << move_count << endl;
	return 0;
}

๊ฒฐ๊ณผ

 

 

๋ฐ˜์‘ํ˜•