https://www.acmicpc.net/problem/1600
๋ฌธ์
๋๋ฌผ์์์ ๋ง ํ์ถํ ์์ญ์ด ํ ๋ง๋ฆฌ๊ฐ ์ธ์๊ตฌ๊ฒฝ์ ํ๊ณ ์๋ค. ๊ทธ ๋ ์์ ๋ง(Horse)์ด ๋๊ธฐ๋ฅผ ๊ฐ์ ํ ์ํ๋ค. ๊ทธ๋์ ๊ทธ๋ ๋ง์ ์์ง์์ ์ ์ฌํ ์ดํด๋ณด๊ณ ๊ทธ๋๋ก ๋ฐ๋ผ ํ๊ธฐ๋ก ํ์๋ค. ๋ง์ ๋ง์ด๋ค. ๋ง์ ๊ฒฉ์ํ์์ ์ฒด์ค์ ๋์ดํธ์ ๊ฐ์ ์ด๋๋ฐฉ์์ ๊ฐ์ง๋ค. ๋ค์ ๊ทธ๋ฆผ์ ๋ง์ ์ด๋๋ฐฉ๋ฒ์ด ๋ํ๋์๋ค. xํ์ํ ๊ณณ์ผ๋ก ๋ง์ด ๊ฐ ์ ์๋ค๋ ๋ป์ด๋ค. ์ฐธ๊ณ ๋ก ๋ง์ ์ฅ์ ๋ฌผ์ ๋ฐ์ด๋์ ์ ์๋ค.
x | x | |||
x | x | |||
๋ง | ||||
x | x | |||
x | x |
๊ทผ๋ฐ ์์ญ์ด๋ ํ ๊ฐ์ง ์ฐฉ๊ฐํ๊ณ ์๋ ๊ฒ์ด ์๋ค. ๋ง์ ์ ๋ ๊ฒ ์์ง์ผ ์ ์์ง๋ง ์์ญ์ด๋ ๋ฅ๋ ฅ์ด ๋ถ์กฑํด์ ์ด K๋ฒ๋ง ์์ ๊ฐ์ด ์์ง์ผ ์ ์๊ณ , ๊ทธ ์ธ์๋ ๊ทธ๋ฅ ์ธ์ ํ ์นธ์ผ๋ก๋ง ์์ง์ผ ์ ์๋ค. ๋๊ฐ์ ๋ฐฉํฅ์ ์ธ์ ํ ์นธ์ ํฌํจ๋์ง ์๋๋ค.
์ด์ ์์ญ์ด๋ ๋จธ๋๋จผ ์ฌํ๊ธธ์ ๋ ๋๋ค. ๊ฒฉ์ํ์ ๋งจ ์ผ์ชฝ ์์์ ์์ํด์ ๋งจ ์ค๋ฅธ์ชฝ ์๋๊น์ง ๊ฐ์ผํ๋ค. ์ธ์ ํ ๋ค ๋ฐฉํฅ์ผ๋ก ํ ๋ฒ ์์ง์ด๋ ๊ฒ, ๋ง์ ์์ง์์ผ๋ก ํ ๋ฒ ์์ง์ด๋ ๊ฒ, ๋ชจ๋ ํ ๋ฒ์ ๋์์ผ๋ก ์น๋ค. ๊ฒฉ์ํ์ด ์ฃผ์ด์ก์ ๋, ์์ญ์ด๊ฐ ์ต์ํ์ ๋์์ผ๋ก ์์์ง์ ์์ ๋์ฐฉ์ง์ ๊น์ง ๊ฐ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ K๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ ๊ฒฉ์ํ์ ๊ฐ๋ก๊ธธ์ด W, ์ธ๋ก๊ธธ์ด H๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ H์ค์ ๊ฑธ์ณ W๊ฐ์ ์ซ์๊ฐ ์ฃผ์ด์ง๋๋ฐ, 0์ ์๋ฌด๊ฒ๋ ์๋ ํ์ง, 1์ ์ฅ์ ๋ฌผ์ ๋ปํ๋ค. ์ฅ์ ๋ฌผ์ด ์๋ ๊ณณ์ผ๋ก๋ ์ด๋ํ ์ ์๋ค. ์์์ ๊ณผ ๋์ฐฉ์ ์ ํญ์ ํ์ง์ด๋ค. W์ H๋ 1์ด์ 200์ดํ์ ์์ฐ์์ด๊ณ , K๋ 0์ด์ 30์ดํ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ญ์ด์ ๋์์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ์์์ ์์ ๋์ฐฉ์ ๊น์ง ๊ฐ ์ ์๋ ๊ฒฝ์ฐ์ -1์ ์ถ๋ ฅํ๋ค.
ํ์ด
[๐ Baaaaaarking/0x09๊ฐ - BFS] - [BOJ S2][C++] ๋ฐฑ์ค 7562๋ฒ: ๋์ดํธ์ ์ด๋
[๐ Baaaaaarking/0x09๊ฐ - BFS] - [BOJ G4][C++] ๋ฐฑ์ค 2206๋ฒ : ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
์ ๋๊ฐ์ง ๋ฌธ์ ๋ฅผ ์งฌ๋ฝ์ํจ ๋ฏํ ๋ฌธ์ ์๋ค
๋ง์ ์ด๋ ๋ฐฉํฅ์ ์ ์ค์ ํด์ฃผ๊ณ
๋ฐฉ๋ฌธ๋ฐฐ์ด์ 3์ฐจ๋ก ๋ง๋ค์ด์ ๋ง์ฒ๋ผ ์ด๋ํ ํ์๋ฅผ ์ ์ฅํด์ฃผ๋
// Authored by : seondal
// ํ์ด : https://whkakrkr.tistory.com/
// Co-authored by : -
//#include <bits/stdc++.h>
#include <iostream>
#include <queue>
using namespace std;
int mdx[4] = {0,0,-1,1};
int mdy[4] = {1,-1,0,0};
int hdx[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int hdy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
int k,w,h;
int board[202][202];
int dis[202][202][32];
queue<tuple<int,int,int>> q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> k >> w >> h;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++) {
cin >> board[i][j];
for(int t=0; t<=k; t++)
dis[i][j][t] = -1;
}
}
q.push({0,0,0});
dis[0][0][0] = 0;
while(!q.empty()){
int cx, cy, horse;
tie(cx,cy,horse) = q.front();
q.pop();
// ๋ง์ฒ๋ผ ์์ง์ด๊ธฐ
if(horse < k){
for(int dir=0; dir<8; dir++){
int x = cx + hdx[dir];
int y = cy + hdy[dir];
if(x<0 || x>=h || y<0 || y>=w) continue;
if(board[x][y]==1 || dis[x][y][horse+1]>=0) continue;
dis[x][y][horse+1] = dis[cx][cy][horse] + 1;
q.push({x,y,horse+1});
}
}
// ์์ญ์ด์ฒ๋ผ ์์ง์ด๊ธฐ
for(int dir=0; dir<4; dir++){
int x = cx + mdx[dir];
int y = cy + mdy[dir];
if(x<0 || x>=h || y<0 || y>=w) continue;
if(board[x][y]==1 || dis[x][y][horse]>=0) continue;
dis[x][y][horse] = dis[cx][cy][horse] + 1;
q.push({x,y,horse});
}
}
int ans = 40000;
for(int i=0; i<=k; i++) {
if(dis[h-1][w-1][i] == -1) continue;
ans = min(ans, dis[h-1][w-1][i]);
}
if(ans == 40000) cout << -1;
else cout << ans;
return 0;
}
/*
*/
์ํ์ฐฉ์ค 1
๊ทธ๋ฅ.. ์ฒ์์ ํ์ด์ ํ๋ฆฐ๊ฑฐ..
๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ 2์ฐจ์๋ฐฐ์ด๋ก ํ๋๋ใ ใ
// Authored by : seondal
// ํ์ด : https://whkakrkr.tistory.com/
// Co-authored by : -
//#include <bits/stdc++.h>
#include <iostream>
#include <queue>
using namespace std;
int mdx[4] = {0,0,-1,1};
int mdy[4] = {1,-1,0,0};
int hdx[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int hdy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
int k,w,h;
int board[202][202];
pair<int,int> dis[202][202]; // {๋ง์ฒ๋ผ ์์ง์ธ ํ์, ์ด ์์ง์ ํ์}
queue<pair<int,int>> q;
int horse = 0; // ๋ง์ฒ๋ผ ์์ง์ธ ํ์
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> k >> w >> h;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++) {
cin >> board[i][j];
dis[i][j] = {0,-1};
}
}
q.push({0,0});
dis[0][0] = {0,0};
while(!q.empty()){
auto c = q.front();
q.pop();
// ๋ง์ฒ๋ผ ์์ง์ด๊ธฐ
if(dis[c.first][c.second].first < k){
for(int dir=0; dir<8; dir++){
int x = c.first + hdx[dir];
int y = c.second + hdy[dir];
if(x<0 || x>=h || y<0 || y>=w) continue;
if(board[x][y]==1 || dis[x][y].second>=0) continue;
q.push({x,y});
dis[x][y] = {dis[c.first][c.second].first+1, dis[c.first][c.second].second+1};
}
}
for(int dir=0; dir<4; dir++){
int x = c.first + mdx[dir];
int y = c.second + mdy[dir];
if(x<0 || x>=h || y<0 || y>=w) continue;
if(board[x][y]==1 || dis[x][y].second>=0) continue;
q.push({x,y});
dis[x][y] = {dis[c.first][c.second].first, dis[c.first][c.second].second+1};
}
}
cout << dis[h-1][w-1].second;
return 0;
}
/*
*/
์ฐพ์๋ณด๋ ๋ค์ ๋ฐ๋ก๊ฐ ์๋๋ค
์ ๋ ฅ 1 4 4 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0
์ ๋ต : 4
์ถ๋ ฅ : -1
https://www.acmicpc.net/board/view/50114
๋๋ ๋๊ฐ์ด ํธ์ ๋ถ์ด ๊ณ์ จ๋ค
๊ทธ๋ฆฌ๊ณ ์น์ ํ ๋ฐ๋ก์ ๋ต๋ณ๊ณผ ์ค๋ช
.. ๊ฐ์ฌํฉ๋๋ค ํใ ใ ใ
์ํ์ฐฉ์ค 2
์ ๋๋์ค ์์๋๋ฐ...
์๋๋ค...
๋์ ์ฒ์ ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ์ ํฅ์ฐ...
์ผ๋จ ์ด์ ๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง
์์ธ์ ์ด๊ฑฐ์๋ค
// ๋ง์ฒ๋ผ ์์ง์ด๊ธฐ
if(horse < k){
for(int dir=0; dir<8; dir++){
int x = cx + hdx[dir];
int y = cy + hdy[dir];
if(x<0 || x>=h || y<0 || y>=w) continue;
// if(board[x][y]==1 || dis[x][y][horse]>=0) continue;
if(board[x][y]==1 || dis[x][y][horse+1]>=0) continue;
dis[x][y][horse+1] = dis[cx][cy][horse] + 1;
q.push({x,y,horse+1});
}
}
์ฃผ์์ฒ๋ฆฌํ ๋ถ๋ถ์ ์๋์ฒ๋ผ ๋ฐ๊ฟ์คฌ๋๋
๋๋จธ์ง ๋ถ๋ถ์ ๋ค ๋๊ฐ์๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ์๋ฌ๋ค
https://www.acmicpc.net/board/view/39705
๋ค ํ๊ณ ์ฐพ์๋ณด๋ ๋๋ ๋น์ทํ ์ฌ๋์ด ๋ ์์๋ค ํใ ใ
'๐ Baaaaaarking > 0x09๊ฐ - BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 9466๋ฒ: ํ ํ๋ก์ ํธ (0) | 2023.05.04 |
---|---|
[BOJ G5][C++] ๋ฐฑ์ค 13549๋ฒ : ์จ๋ฐ๊ผญ์ง 3 (๋ฐํ์์๋ฌ์์์ ์) (0) | 2022.04.16 |
[BOJ G4][C++] ๋ฐฑ์ค 2573๋ฒ: ๋น์ฐ (0) | 2022.04.15 |
[BOJ G4][C++] ๋ฐฑ์ค 2206๋ฒ : ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2022.04.13 |
[BOJ S1][C++] 2468๋ฒ: ์์ ์์ญ (76%) (0) | 2022.04.07 |