문제: https://www.acmicpc.net/problem/1012
dfs (깊이 우선 탐색) 문제입니다. 처음에 UNIT 값을 50으로 주고 풀어 문제 난이도에 비해 상당히 절 헤매게 만든 문제입니다. getNextPosition 에서의 계산 방식 때문에 UNIT 값을 51 이상으로 주어야되었었네요.
my solving
c++
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include <fstream> #include <iostream> #include <algorithm> #include <set> using namespace std; const int UNIT = 100; set<int> points; int maxPosition; int getNextPosition(int position, int direction) { int ret = position; switch (direction) { case 0: ret -= UNIT; break; case 1: ret++; break; case 2: ret += UNIT; break; case 3: ret--; break; default: break; } if (ret < 0 || ret > maxPosition) return -1; return ret; } void recursive(int position) { points.erase(position); for (int i = 0; i < 4; i++) { int temp = getNextPosition(position, i); if (temp != -1) { set<int>::iterator it = points.find(temp); if (it != points.end()) recursive(temp); } } } int solve() { int ret = 0; while (true) { if (points.empty()) break; ret++; set<int>::iterator it = points.begin(); recursive(*it); } return ret; } int main() { int cases; cin >> cases; for (int i = 0; i < cases; i++) { int m, n, k; points.clear(); cin >> m >> n >> k; maxPosition = m - 1 + (n - 1) * UNIT; for (int i = 0; i < k; i++) { int x, y; cin >> x >> y; points.insert(x + y * UNIT); } cout << solve() << endl; } return 0; } | cs |
'Algorithm, Data structure > Solved Algorithmic Problem' 카테고리의 다른 글
BAEKJOON 1015 - 수열 정렬 (0) | 2016.07.29 |
---|---|
BAEKJOON 1014 - 컨닝 (0) | 2016.07.29 |
BAEKJOON 1013 - Contact (0) | 2016.07.24 |
BAEKJOON 1011 - Fly me to the Alpha Centauri (0) | 2016.07.23 |
BAEKJOON 1010 - 다리 놓기 (0) | 2016.07.23 |