Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준 2108
- 백준 19238
- boj 10800
- 백준 2178
- 백준 2635
- 백준 2470
- boj 1503
- 10800
- boj 2108
- 2167
- boj 19238
- 백준 10800
- boj 2636
- 백준 1806
- boj 2470
- 백준 2167
- 백준 2661
- boj 1697
- 백준 1503
- 2636
- boj 2667
- boj 1806
- 백준 2206
- 백준 1697
- boj 2206
- boj 2661
- 백준 2636
- boj 2167
- boj 2178
- boj 2635
Archives
- Today
- Total
말랑말랑한 개발자 이야기
[백준 16174번] 점프왕 쩰리 (Large) 본문
[백준 16174번] 점프왕 쩰리 (Large)
문제
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
입력
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 64)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
출력
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
풀이
#include <iostream>
#include <queue>
using namespace std;
int N, M;
int dx[] = {1,0};
int dy[] = {0,1};
int arr[64][64];
bool visit[64][64] = {false,};
bool bfs(int i, int j, int k){
queue<pair<pair<int, int>, int>> q;
q.push(make_pair(make_pair(i,j), k));
while(!q.empty()){
int a = q.front().first.first;
int b = q.front().first.second;
int c = q.front().second;
q.pop();
for(int i=0;i<2;i++){
int x = a + dx[i] * c;
int y = b + dy[i] * c;
if(x < 0 || y < 0 || x >= N || y >= N) continue;
if(visit[x][y]) continue;
if(arr[x][y] == -1){
return true;
}
else{
visit[x][y] = true;
int t = arr[x][y];
q.push(make_pair(make_pair(x, y), t));
}
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cin >> arr[i][j];
}
}
if(bfs(0,0,arr[0][0])) cout << "HaruHaru";
else cout <<"Hing";
return 0;
}
원래 풀던 BFS 형식에서 오른쪽과 아래, 두방향으로 제한하고 1칸 움직이는게 아닌 MAP 상의 값 만큼 이동시키며 풀면된다. 종료 조건은 큐가 비게 되면 Hing이고, -1이 큐에 들어가게 되면 HaruHaru가 된다.
+ 방문 처리를 하지 않으면 중복 방문시 메모리 초과가 날 수 있다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준 5557번] 1학년 (0) | 2021.05.18 |
---|---|
[백준 19947번] 투자의 귀재 배주형 (0) | 2021.05.18 |
[백준 14716번] 현수막 (0) | 2021.05.17 |
[백준 1713번] 후보 추천하기 (0) | 2021.05.17 |
[백준 15486번] 퇴사2 (0) | 2021.05.17 |