‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 3)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
https://www.acmicpc.net/problem/16173
BFS, DFS차이는 내부적으로 큐를 쓰냐 스택을 쓰냐로 간단히 갈릴수있음. 구현하는 방법은 여럿이나 위 자료구조를 선택함에따라 갈리는것. 즉, 문제에따라 필요한사항을 구현하고, 다음 탐색위치에 대한 정보쌍을 큐에 넣냐 스택에넣냐 이다.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using std::queue; using std::pair; using std::stack;
int n, **map;
bool** visited;
int dx[2] = { 0, 1 };
int dy[2] = { 1, 0 };
bool bfs() {
queue<pair<int, int>> q;
q.push({ 0, 0 });
visited[0][0] = true;
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if (map[x][y] == -1) //도착지점일경우 게임종료
return true;
for (int i = 0; i < 2; i++) { //오른쪽, 아래로만 이동
//다음 좌표 : 우측 또는 아래로 map에 적힌만큼 이동
int xx = x + dx[i] * map[x][y];
int yy = y + dy[i] * map[x][y];
//쩰리가 유효한 맵좌표상에 있을때만
if (0 <= xx && xx <= n - 1 && 0 <= yy && yy <= n - 1) {
if (!visited[xx][yy]) {
visited[xx][yy] = true;
q.push({ xx, yy }); //큐에넣고 반복
}
}
}
}
return false;
}
bool dfs() {
stack<pair<int, int>> s;
s.push({ 0, 0 });
visited[0][0] = true;
while (!s.empty()) {
int x = s.top().first;
int y = s.top().second;
s.pop();
if (map[x][y] == -1)
return true;
for (int i = 0; i < 2; i++) {
int xx = x + dx[i] * map[x][y];
int yy = y + dy[i] * map[x][y];
if (0 <= xx && xx <= n - 1 && 0 <= yy && yy <= n - 1) {
if (!visited[xx][yy]) {
visited[xx][yy] = true;
s.push({ xx, yy });
}
}
}
}
return false;
}
int main(void) {
scanf("%d", &n);
map = new int* [n];
visited = new bool* [n];
for (int i = 0; i < n; i++) {
map[i] = new int[n];
visited[i] = new bool[n];
for (int j = 0; j < n; j++) {
scanf("%d", &map[i][j]);
visited[i][j] = false;
}
}
//if (bfs())
// printf("HaruHaru");
//else
// printf("Hing");
if (dfs())
printf("HaruHaru");
else
printf("Hing");
return 0;
}