https://www.acmicpc.net/problem/16174
문제
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
입력
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 64)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
출력
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
문제 풀이
그래프 탐색 문제.
아래, 오른쪽으로만 이동할 수 있다는 점과 한 칸씩이 아니라 해당 칸에 쓰여진 숫자만큼 이동할 수 있다는 점만 빼면 그래프 탐색 기본 문제이다. 1, 1에서 시작하는 bfs나 dfs를 구현하되, 게임 판에 쓰여진 숫자의 배수만큼 이동하도록 구현해준다.
아래는 코드.
더보기
#include <iostream>
#include <stack>
#include <utility>
using namespace std;
int dx[] = { 0, 1 };
int dy[] = { 1, 0 };
int N;
int** map;
bool** isVisited;
stack<pair<int, int>> dfsStack;
void dfs()
{
dfsStack.push(pair(0, 0));
isVisited[0][0] = true;
while (!dfsStack.empty())
{
pair<int, int> current = dfsStack.top();
bool isAdjacent = false;
if (current.first == N - 1 && current.second == N - 1)
{
break;
}
for (int i = 0; i < 2 && isAdjacent==false; i++)
{
int nextX = current.first + dx[i] * map[current.first][current.second];
int nextY = current.second + dy[i] *map[current.first][current.second];
if (nextX >= 0 && nextX < N && nextY >= 0 && nextY < N && isVisited[nextX][nextY] == false)
{
isAdjacent = true;
dfsStack.push(pair(nextX, nextY));
isVisited[nextX][nextY] = true;
}
}
if (isAdjacent == false)
{
dfsStack.pop();
}
}
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> N;
map = new int*[N];
isVisited = new bool*[N];
for (int i = 0; i < N; i++)
{
isVisited[i] = new bool[N];
map[i] = new int[N];
for (int j = 0; j < N; j++)
{
cin >> map[i][j];
isVisited[i][j] = false;
}
}
dfs();
if (isVisited[N - 1][N - 1] == false)
{
cout << "Hing" << "\n";
}
else
{
cout << "HaruHaru" << "\n";
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 31910] 이진수 격자 (C++) (0) | 2025.01.25 |
---|---|
[백준 9324] 진짜 메시지 (C++) (0) | 2025.01.24 |
[백준 16946] 벽 부수고 이동하기 4 (C++) (0) | 2025.01.22 |
[백준 22353] 헤이카카오 (C++) (0) | 2025.01.21 |
[백준 20500] Ezreal 여눈부터 가네 ㅈㅈ (C++) (0) | 2025.01.20 |