📕문제
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
📕입력
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 64)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
📕출력
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
🔎문제 해석
문제를 읽어보면 그냥 쉽게 풀 수 있다.
- 출발점은 (0,0) 도착점은 (n-1,n-1)이다.
- 이동방향은 오른쪽과 아래 방향
- 배열을 넘어서는 이동은 할 수 없음.
- 한 번에 이동할 수 있는 칸은 밟고 있는 칸에 적혀있는 수만큼 이동 가능(초과, 미만 x)
BFS로 접근하면 굉장히 쉽게 풀 수 있다.
다만 주의할 점은 이동방향 * 현재 좌표에 적혀있는 값만큼 이동한다는 것만 생각하면 쉽게 풀 수 있다.
💻코드
/*
실버1
16174 점프왕 쪨리(Large)
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int n;
vector<vector<int>> graph;
vector<vector<int>> visit;
queue<pair<int, int>> q;
vector<int> x = {1, 0};
vector<int> y = {0, 1};
string win = "HaruHaru";
string lose = "Hing";
bool result = false;
void bfs();
int main()
{
cin >> n;
graph.resize(n, vector<int>(n, 0)); //입력 행렬
visit.resize(n, vector<int>(n, 0)); //방문 행렬
for (int i = 0; i < n; i++) //행렬 입력받기
{
for (int j = 0; j < n; j++)
{
cin >> graph[i][j];
}
}
q.push(make_pair(0, 0)); //출발점 queue에 넣기
visit[0][0] = 1; //출발점 방문 체크
bfs();
if (result) //도달할 수 있는 경우
{
cout << win;
}
else //도달할 수 없는 경우
{
cout << lose;
}
}
void bfs()
{
while (!q.empty())
{
int tempx = q.front().first;
int tempy = q.front().second;
q.pop();
if (tempx == n - 1 && tempy == n - 1) //만약 도착점이라면
{
result = true;
return;
}
for (int i = 0; i < 2; i++) //오른쪽 아래,
{
int fx = tempx + x[i] * graph[tempx][tempy];
int fy = tempy + y[i] * graph[tempx][tempy];
if (fx < 0 || fy < 0 || fx >= n || fy >= n) //적절한 좌표가 아니라면 pass
{
continue;
}
if (visit[fx][fy] == 0) //이동가능한 좌표고, 만약 방문을 안했다면
{
q.push(make_pair(fx, fy)); //queue에 푸쉬하고, 방문처리를 해줌.
visit[fx][fy] = 1;
}
}
}
}
느낀 점
- 그냥 실버 문제
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준 1987] - 알파벳(C++) (0) | 2022.11.17 |
---|---|
[백준 15900] - 나무 탈출(C++) (0) | 2022.11.13 |
[백준 2206] - 벽 부수고 이동하기(C++) (0) | 2022.11.11 |
[백준 2636] - 치즈(C++) (0) | 2022.11.11 |
[백준 9205] - 맥주 마시면서 걸어가기(C++) (0) | 2022.11.10 |