반응형
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
- incr
- 기술면접
- boj #19237 #어른 상어
- 백준
- OFFSET
- 경력
- Docker
- msSQL
- 백트래킹
- @P0
- dfs
- 소프티어
- upper_bound
- 처우산정
- 물채우기
- Kafka
- 이분탐색
- compose
- 13908
- 6987
- 매개변수탐색
- 파라메트릭
- softeer
- 성적평가
- 오퍼레터
- BOJ
- 처우협의
- 퇴사통보
- BFS
- 연결요소
Archives
- Today
- Total
기술 블로그
16509번 장군 본문
728x90
반응형
충남대학교 제 2회 생각하는 프로그래밍 대회 G번 문제
https://www.acmicpc.net/problem/16509
처음에 계속 '-1'이 나오길래, 어디가 잘 못 되었는지 보고있었는데
가는 '도중에' 기물(왕)이 있으면 안 되었다.
나는 도착 지점까지 체크하고 있었다.
즉, isCan 함수 안에 for문이 2번 돌아야한다.(처음에 3으로 설정하였음.)
추가적으로 더 간단하게 코딩할 수 있다.
단순히 첫 번째 지점 검사와 두 번째 지점 검사를 dy dx처럼 배열을 활용하는 것이다.(첫 번째 코드)
<첫 번째 지점과 두 번째 지점 검사를 dy, dx처럼 배열 활용>
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 | #include <iostream> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> #include <map> using namespace std; typedef struct info { int y; int x; int count; }info; info Ho; info King; // 세 칸 이동(도착 지점) int dy[8] = { -3, -2, 2, 3, 3, 2, -2, -3 }; int dx[8] = { -2, -3, -3, -2, 2, 3, 3, 2 }; // 한 칸 이동(가는 경로) int vy[8] = { -1, 0, 0, 1, 1, 0, 0, -1 }; int vx[8] = { 0, -1, -1, 0, 0, 1, 0 }; // 두 칸 이동(가는 경로) int ty[8] = { -2, -1, 1, 2, 2, 1, -1, -2 }; int tx[8] = { -1, -2, -2, -1, 1, 2, 2, 1 }; int R1 = 0, C1 = 0, R2 = 0, C2 = 0; int BFS() { bool visit[10][9] = { false, }; memset(visit, false, sizeof(visit)); queue<info> q; q.push(Ho); visit[Ho.y][Ho.x] = true; while (!q.empty()) { int qSize = q.size(); while (qSize--) { info goHo = q.front(); q.pop(); if (goHo.y == King.y && goHo.x == King.x) return goHo.count; for (int i = 0; i < 8; i++) { // 한 칸 검사 int y = goHo.y + vy[i]; int x = goHo.x + vx[i]; if (y < 0 || y >= 10 || x < 0 || x >= 9 || (y == King.y && x == King.x)) continue; // 두 칸 검사 y = goHo.y + ty[i]; x = goHo.x + tx[i]; if (y < 0 || y >= 10 || x < 0 || x >= 9 || (y == King.y && x == King.x)) continue; // 세 칸 (도착 지점) 검사 y = goHo.y + dy[i]; x = goHo.x + dx[i]; if (y < 0 || y >= 10 || x < 0 || x >= 9 || visit[y][x]) continue; q.push({ y, x, goHo.count + 1 }); visit[y][x] = true; } } } return -1; } int main(void) { scanf("%d %d %d %d", &R1, &C1, &R2, &C2); Ho = { R1, C1, 0 }; King = { R2, C2, 0 }; printf("%d\n", BFS()); return 0; } | cs |
<따로 지점 검사를 할 때, 배열을 쓰지 않을 경우>
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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | #include <iostream> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> #include <map> using namespace std; int dy[8] = { -3, -2, 2, 3, 3, 2, -2, -3 }; int dx[8] = { -2, -3, -3, -2, 2, 3, 3, 2 }; int R1 = 0, C1 = 0, R2 = 0, C2 = 0; bool isCan(int r, int c, int index) { bool ret = true; int y = 0, x = 0; if (index == 0) { y = -1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } x = -1; } } else if (index == 1) { x = -1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } y = -1; } } else if (index == 2) { x = -1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } y = 1; } } else if (index == 3) { y = 1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } x = -1; } } else if (index == 4) { y = 1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } x = 1; } } else if (index == 5) { x = 1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } y = 1; } } else if (index == 6) { x = 1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } y = -1; } } else if (index == 7) { y = -1; for (int i = 0; i < 2; i++) { r += y; c += x; if (r == R2 && c == C2) { ret = false; break; } x = 1; } } return ret; } int BFS() { bool visit[10][9] = { false, }; memset(visit, false, sizeof(visit)); queue<pair<int, int> > q; q.push({ R1, C1 }); visit[R1][C1] = true; int ret = 0; while (!q.empty()) { int qSize = q.size(); while (qSize--) { int r = q.front().first; int c = q.front().second; q.pop(); if (r == R2 && c == C2) return ret; for (int i = 0; i < 8; i++) { int y = r + dy[i]; int x = c + dx[i]; if (y < 0 || y >= 10 || x < 0 || x >= 9 || visit[y][x]) continue; if (!isCan(r, c, i)) continue; q.push({ y, x }); visit[y][x] = true; } } ++ret; } return -1; } int main(void) { scanf("%d %d", &R1, &C1); scanf("%d %d", &R2, &C2); printf("%d\n", BFS()); return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
16507번 어두운 건 무서워 (0) | 2018.11.23 |
---|---|
16508번 전공책 (0) | 2018.11.23 |
16510번 Predictable Queue (0) | 2018.11.21 |
16504번 종이접기 (0) | 2018.11.19 |
16503번 괄호 없는 사칙연산 (0) | 2018.11.19 |