- ์นด์นด์ค ์ฝํ
- Union-Find
- golang
- ์ํฐ๋
- ์๊ณ ๋ฆฌ์ฆ
- ํธ๋ฆฌ
- ์ด๋ถํ์
- ์น๋ฆฐ์ด
- DFS
- ์นด์นด์ค2021
- LCs
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- BFS
- ์ฌ๊ท
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- DP
- C++
- js
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ค์ต์คํธ๋ผ
- nestjs
- Python
- go
- ๋ฐฑ์ค
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ์์ฝ๋
- ๋นํธ๋ง์คํน
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ๋นํธ๋งต
- ํ๋ฆฌ์จ๋ณด๋ฉ
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 1600. ๋ง์ด ๋๊ณ ํ ์์ญ์ด ๋ณธ๋ฌธ
๋ฌธ์
https://www.acmicpc.net/problem/1600
ํ์ด
[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;
}
๊ฒฐ๊ณผ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 5052. ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2021.07.06 |
---|---|
[๋ฐฑ์ค/C++] 1967. ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2021.06.29 |
[๋ฐฑ์ค/C++] 1194. ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์ (0) | 2021.06.02 |
[๋ฐฑ์ค/C++] 2250. ํธ๋ฆฌ์ ๋์ด์ ๋๋น (0) | 2021.06.02 |
[๋ฐฑ์ค/C++] 9019. DSLR (0) | 2021.05.26 |