반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- upper_bound
- 파라메트릭
- BOJ
- compose
- softeer
- BFS
- 13908
- 경력
- dfs
- 물채우기
- 기술면접
- 소프티어
- Kafka
- 6987
- 이분탐색
- @P0
- Docker
- 백준
- 퇴사통보
- 성적평가
- incr
- msSQL
- 오퍼레터
- 백트래킹
- 매개변수탐색
- 처우협의
- boj #19237 #어른 상어
- 처우산정
- 연결요소
- OFFSET
Archives
- Today
- Total
기술 블로그
4991번 로봇 청소기 본문
728x90
반응형
https://www.acmicpc.net/problem/4991
지난 코드 : https://hsdevelopment.tistory.com/192
구현과 백트래킹 그리고 BFS을 모두 혼합한 문제를 공부할겸 다시 풀어보았다.
next_permutation()을 사용하지 않고, 구현하려고 하였으나, 이상하게 구현이 안 되었다.
그래서, 사용하였더니 또 틀렸다.
이유는 알고보니,
1 1
o
0
위의 경우와
나는 단순히
while()을 사용했었는데, 처음인 경우(1, 2, 3, 4..)가 있어서
do ~ while()을 사용해야 한다.
시간도 거의 1/3이나 줄었다.
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <bits/stdc++.h> using namespace std; int w = 0, h = 0, ans = 0, dist[11][11] = { 0, }; int dy[4] = { 0, 1, 0, -1 }; int dx[4] = { 1, 0, -1, 0 }; char Map[22][22]; vector<pair<int, int> > v; vector<int> pt; int bfs(pair<int, int> from, pair<int, int> to) { int ret = 0; bool visit[22][22] = { false, }; queue<pair<int, int> > q; q.push(from); visit[from.first][from.second] = true; while (!q.empty()) { int qSize = q.size(); while (qSize--) { int r = q.front().first; int c = q.front().second; q.pop(); if (r == to.first && c == to.second) return ret; for (int i = 0; i < 4; i++) { int y = r + dy[i]; int x = c + dx[i]; if (y < 0 || y >= h || x < 0 || x >= w || visit[y][x] || Map[y][x] == 'x') continue; visit[y][x] = true; q.push({ y, x }); } } ++ret; } return -1; } void init() { for (int i = 0; i < 11; i++) for (int j = 0; j < 11; j++) dist[i][j] = 2e9; v.clear(); pt.clear(); ans = 2e9; } int main(void) { while (1) { init(); bool stop = false; scanf("%d %d", &w, &h); if (w == 0 && h == 0) break; for (int i = 0; i < h; i++) { scanf("%s", Map[i]); for (int j = 0; j < w; j++) if (Map[i][j] == 'o') v.insert(v.begin(), { i, j }); else if (Map[i][j] == '*') v.push_back({ i, j }); } for (int i = 0; i < v.size() && !stop; i++) for (int j = 0; j < v.size() && !stop; j++) { if (i <= j) continue; dist[i][j] = dist[j][i] = bfs(v.at(i), v.at(j)); if (dist[i][j] == -1) stop = true; } if (stop) { printf("-1\n"); continue; } for (int i = 0; i < v.size() - 1; i++) pt.push_back(i + 1); do { int start = 0, sum = 0; for (auto i : pt) { sum += dist[start][i]; start = i; } ans = min(ans, sum); } while (next_permutation(pt.begin(), pt.end())); if (ans == 2e9) ans = 0; printf("%d\n", ans); } return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
9251번 LCS (0) | 2019.05.23 |
---|---|
16932번 모양 만들기 (0) | 2019.05.20 |
11559번 Puyo Puyo (0) | 2019.05.18 |
14655번 욱제는 도박쟁이야!! (0) | 2019.05.10 |
11441번 합 구하기 (0) | 2019.05.09 |