[SW Expert Academy] 1211. Ladder2
나의 풀이
1. 출발지점을 찾아야 하기 때문에 도착지점에서부터 탐색한다.
2. 출발지점까지 움직이면서 움직인 거리를 저장한다.
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 | // [S/W 문제해결 기본] 1211. 2일차 - Ladder2 #include<iostream> #include<cstring> using namespace std; int ladder[101][101]; int visited[101][101]; int dis, departure; // 왼쪽, 오른쪽, 위 int dx[3] = {0, 0, -1}; int dy[3] = {-1, 1, 0}; void finddeparture(int _x, int _y) { int local_distance = 0; int x = _x; int y = _y; while (1) { if (x == 0) { if (dis > local_distance) { dis = local_distance; departure = y; } return; } for (int i = 0; i < 3; i++) { int mx = x + dx[i]; int my = y + dy[i]; if (mx < 0 || mx >= 100 || my < 0 || my >= 100) continue; if (ladder[mx][my] == 0) continue; if (visited[mx][my]) continue; x = mx; y = my; local_distance++; visited[mx][my] = 1; break; } } return; } int main(void) { int num; for (int T = 1; T <= 1; T++) { memset(ladder, 0, sizeof(int) * 101 * 101); dis = 10000; cin >> num; for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { cin >> ladder[i][j]; } } for (int i = 0; i < 100; i++) { memset(visited, 0, sizeof(int) * 101 * 101); if (ladder[99][i]) finddeparture(99, i); } cout << '#' << num << ' ' << departure << '\n'; } return 0; } | cs |
'Problem > Brute force' 카테고리의 다른 글
[SW Expert Academy] 1767. 프로세서 연결하기 (1) | 2019.03.07 |
---|---|
[C/C++] BOJ 3/2 코딩테스트 대비 모의고사 A번 - 계란으로 계란치기 (0) | 2019.03.02 |
[SW Expert Academy] 1209. Sum (0) | 2019.02.26 |
[SW Expert Academy] 1208. Flatten (0) | 2019.02.26 |
[SW Expert Academy] 1206. View (0) | 2019.02.26 |