※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 11558번 문제인 The Game of Death이다.
문제는 아래 링크를 확인하자.
11558번: The Game of Death
첫 줄에는 테스트 케이스의 숫자 T가 주어지며, 이어서 T번에 걸쳐 테스트 케이스들이 주어진다. 매 테스트 케이스의 첫 줄에는 플레이어의 숫자 N(1 ≤ N ≤ 10,000)이 주어진다. 이어서 N줄에 걸쳐
www.acmicpc.net
각 테스트케이스에 해당되는 문제를 간단히 요약하면 다음과 같다.
1) 1부터 N까지의 정수 번호가 붙은 N개의 노드가 있다. 각 노드에는 그 노드를 출발점으로 하는 directed edge가 정확히 하나씩 존재한다. (이 edge는 loop일 수도 있다.)
2) 1번 노드에서 N번 노드까지 가는 최단경로의 길이를 출력한다. 그러한 경로가 없다면 0을 출력한다.
각 노드를 방문할 때마다 다음으로 방문할 수 있는 노드는 오직 하나뿐이므로, 이 문제에서는 그래프를 배열로 구현할 수 있다. visited 배열을 만들어 N을 먼저 방문하면 경로의 길이를, 방문했던 점으로 되돌아오는 경우가 저 발생한다면 0을 리턴한다.
아래는 제출한 소스코드다.
#include <iostream>
#include <cstring>
using namespace std;
int G[10001];
int visited[10001];
bool chk = 1;
int cnt = 0;
void dfs(int current, int N) {
if (current == N) return;
int next = G[current];
if (visited[next]) chk = 0;
else {
cnt++;
visited[next] = 1;
dfs(next, N);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) {
chk = 1;
cnt = 0;
memset(visited, 0, sizeof(visited));
int N; cin >> N;
for (int i = 1; i <= N; i++) {
cin>>G[i];
}
dfs(1, N);
if (chk) cout << cnt << '\n';
else cout << 0 << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 11560 // C++] 다항식 게임 (0) | 2021.05.10 |
---|---|
[BOJ 11559 // C++] Puyo Puyo (0) | 2021.05.09 |
[BOJ 11557 // C++] Yangjojang of The Year (0) | 2021.05.07 |
[BOJ 1275 // C++] 커피숍2 (0) | 2021.05.06 |
[BOJ 21237 // C++] Clockwise Fence (0) | 2021.05.05 |