Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1600. ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1600. ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด

bba_dda 2021. 6. 29. 20:17
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ 

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

 

1600๋ฒˆ: ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— ๊ฒฉ์žํŒ์˜ ๊ฐ€๋กœ๊ธธ์ด W, ์„ธ๋กœ๊ธธ์ด H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ H์ค„์— ๊ฑธ์ณ W๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, 0์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ํ‰์ง€, 1์€ ์žฅ์• ๋ฌผ์„ ๋œปํ•œ๋‹ค. ์žฅ์• ๋ฌผ์ด ์žˆ

www.acmicpc.net

 

ํ’€์ด 

[BFS + ๊ตฌ์กฐ์ฒด]

BFS๋ฅผ ์ด์šฉํ•ด์„œ ํ’€๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์ผ๋ฐ˜์ ์ธ BFS์—์„œ, ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋งŒ์„ ๊ณ ๋ คํ–ˆ๋‹ค๋ฉด, 

์ด ๋ฌธ์ œ์—์„œ๋Š” "๋ง ์ฒ˜๋Ÿผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ"๋„ ๊ณ ๋ คํ•ด์„œ BFS๋ฅผ ๋Œ๋ ค์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋‹ค๋งŒ "๋ง ์ฒ˜๋Ÿผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜"๊ฐ€ K๋ฒˆ์œผ๋กœ ์ •ํ•ด์ ธ์žˆ์œผ๋ฏ€๋กœ, ๋‚จ์€ ํšŸ์ˆ˜ k๋„ ํ์— ๋„ฃ์–ด ํ™•์ธํ•ด์ฃผ์—ˆ๋‹ค. 

 

* ์ฒ˜์Œ์— visited๋ฐฐ์—ด์„ 2์ฐจ์›์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์œ„์น˜๋งŒ ์ฒดํฌํ–ˆ์—ˆ๋Š”๋ฐ, k๋„ ์ด์šฉํ•ด์„œ visited๋ฅผ ์ฒดํฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค! 

https://www.acmicpc.net/board/view/40044 (์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ๋œ ๋ฐ˜๋ก€)

 

* W์™€ H๊ฐ€ ๋ชจ๋‘ 1์ธ ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค 

https://www.acmicpc.net/board/view/67499 

 

์ฝ”๋“œ 

#include <iostream>
#include <queue>

using namespace std;

int K, W, H;
bool table[200][200];
bool visited[31][200][200] = { 0, }; //k๊ฐ€ ๋ช‡๋ฒˆ ๋‚จ์•˜๋Š”์ง€์— ๋”ฐ๋ผ visited๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์ค˜์•ผํ•จ 

int dh[4] = { -1,1,0,0 }; // ์ƒํ•˜์ขŒ์šฐ 
int dw[4] = { 0,0,-1,1 };

int horseH[8] = { -2,-2,-1,1,2, 2, 1,-1 };
int horseW[8] = { -1, 1, 2,2,1,-1,-2,-2 };

struct Node { 
	int h;
	int w;
	int k; //๋ง ์ฒ˜๋Ÿผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚จ์€ ํšŸ์ˆ˜
	int count; //์ง€๊ธˆ๊นŒ์ง€ ์›€์ง์ธ ํšŸ์ˆ˜ 
};
int BFS(int startH, int startW) {
	queue<Node> q;
	q.push({ startH, startW, K, 0 });
	visited[K][startH][startW] = 1;

	while (!q.empty()) {
		int tempH = q.front().h;
		int tempW = q.front().w;
		int k = q.front().k;
		int count = q.front().count;

		q.pop();

		int nextH, nextW;
		if (k > 0) { // ๋ง์ฒ˜๋Ÿผ ์ด๋™
			for (int i = 0;i < 8;i++) {
				nextH = tempH + horseH[i];
				nextW = tempW + horseW[i];
				if (nextH < 0 || nextH >= H || nextW < 0 || nextW >= W) continue; //table ๋ฒ”์œ„ ์•ˆ์ธ์ง€ ์ฒดํฌ
				if (!visited[k-1][nextH][nextW] && !table[nextH][nextW]) { // ๋ฐฉ๋ฌธํ•œ์ ์ด ์—†๊ณ , ํ‰์ง€์ด๋ฉด ์ด๋™ 
					if (nextH == H - 1 && nextW == W - 1) return count + 1; // ๋„์ฐฉ์ง€์ด๋ฉด return  
					visited[k - 1][nextH][nextW] = 1;
					q.push({ nextH, nextW, k - 1, count + 1 });
				}
			}
		}
		for (int i = 0;i < 4;i++) { // ์ƒํ•˜์ขŒ์šฐ ์ด๋™ 
			nextH = tempH + dh[i];
			nextW = tempW + dw[i];
			if (nextH < 0 || nextH >= H || nextW < 0 || nextW >= W) continue; //table ๋ฒ”์œ„ ์•ˆ์ธ์ง€ ์ฒดํฌ
			if (!visited[k][nextH][nextW] && !table[nextH][nextW]) { // ๋ฐฉ๋ฌธํ•œ์ ์ด ์—†๊ณ , ํ‰์ง€์ด๋ฉด ์ด๋™ 
				if (nextH == H - 1 && nextW == W - 1) return count + 1; // ๋„์ฐฉ์ง€์ด๋ฉด return  
				visited[k][nextH][nextW] = 1;
				q.push({ nextH, nextW, k, count + 1 });
			}
		}
	}
	return -1;
}
int main() {
	cin >> K >> W >> H;
	for (int h = 0;h < H;h++) {
		for (int w = 0;w < W;w++) {
			cin >> table[h][w];
		}
	}
	
	// H์™€ W๊ฐ€ ๋ชจ๋‘ 1์ด ๋  ์ˆ˜ ์žˆ์Œ! (๋ฌธ์ œ๋ฅผ ๊ผผ๊ผผํžˆ ์ฝ์ž) 
	if (H == 1 && W == 1) {
		cout << 0 << endl;
		return 0;
	}
	int result = BFS(0, 0);
	cout << result << endl;
	return 0;
}

 

๊ฒฐ๊ณผ 

๋ฐ˜์‘ํ˜•