알고리즘
1949. [모의 SW 역량테스트] 등산로 조성
1q2w3e4r!
2018. 11. 8. 16:56
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq
고생 고생하면서 푼 문제 ...
일단 BFS로 풀어보려고 시도 해보았다. 그런데 등산로를 깎는 경우에 대한 저장 정보 처리가 복잡해지기 떄문에 DFS로 바꾸어 풀었다..
문제의 제한 조건이 은근히 까다롭다
1. 제일 높은 등산로부터 등산로를 만들어야한다.
2. ★★ 최대 K 까지 깍을수 있으므로 꼭 K가 아닌 K보다 작은 수로 등산로를 깎을수도 있는 것 이 조건을 맞춰줘야 모든 테스트케이스에서 pass를 받을 수 있다.
3. visit 배열을 통해 다시 되돌아 가지 않도록 하자. 또 재귀가 풀릴때 방문을 해제하고, 길이도 줄여준다. 길이를 줄여주는것에 대한 생각을 못해서 오래걸렸다... 후..
코드
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 | #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<queue> #include<vector> #include<memory.h> using namespace std; int T, N, K; int map[8][8]; int visit[8][8]; int maxN; int dx[4] = { 1,-1,0,0 }; int dy[4] = { 0,0,1,-1 }; int result; struct point { int x, y; }; vector<point> hn; void check() { hn.clear(); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (map[i][j] == maxN) { hn.push_back({ j,i}); } } } } void dfs(int x, int y, int value, int leng, int cut) { for (int i = 0; i < 4; i++) { int mx = x + dx[i]; int my = y + dy[i]; result = max(leng, result); if (mx <0 || mx > N - 1 || my < 0 || my >N - 1) { continue; } else { if (map[my][mx] <value && visit[my][mx]==0) { visit[my][mx] = 1; leng += 1; dfs(mx, my, map[my][mx],leng,cut); leng -= 1; visit[my][mx] = 0; } else if (map[my][mx] >= value && cut == 1 && visit[my][mx] ==0) { for (int offer = 1; offer <= K; offer++) { if (map[my][mx] - offer < value) { visit[my][mx] = 1; leng += 1; dfs(mx, my, map[my][mx] - offer, leng, 0); leng -= 1; visit[my][mx] = 0; break; } } } } } } int main() { freopen("sample_input.txt", "r", stdin); scanf("%d", &T); for (int test = 0; test < T; test++) { scanf("%d%d", &N, &K); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &map[i][j]); maxN = max(maxN, map[i][j]); } } check(); for (int i = 0; i < hn.size(); i++) { visit[hn[i].y][hn[i].x] = 1; dfs(hn[i].x, hn[i].y, maxN, 1,1); memset(visit, 0, sizeof(visit)); } printf("#%d %d\n", test + 1, result); result = 0; maxN = 0; memset(map, 0, sizeof(map)); } } | cs |