https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5V61LqAf8DFAWu
BFS를 이용해서 마름모를 만들어주며 탐색했다.
모든 집으로부터 돈을 다 받는 경우보다, 운용 비용이 더 많이 들어가는 순간 탐색을 멈췄다.
속도가 매우 느린데 단축할 수 있는 방법을 생각해봐야겠다.
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 | #include<iostream> #include<queue> using namespace std; typedef pair<int, int> pii; const int dr[4] = { 0,0,1,-1 }; const int dc[4] = { 1,-1,0,0 }; int oprFee[43], n, pay, map[21][21], dis[21][21]; queue<pii> q; //큐, dis[][] 초기화 void initVis() { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) dis[i][j] = 0; while (!q.empty()) q.pop(); } int bfs(pii st, int k) { int homeCnt = 0; q.push(st); dis[st.first][st.second]++; if (map[st.first][st.second] == 1) homeCnt++; while (!q.empty()) { pii cur = q.front(); q.pop(); if (dis[cur.first][cur.second] == k) return homeCnt; //검색 종료 for (int i = 0; i < 4; i++) { int nr = cur.first + dr[i]; int nc = cur.second + dc[i]; if (nr < 0 || nc < 0 || nr >= n || nc >= n || dis[nr][nc] > 0) continue; q.push({ nr, nc }); dis[nr][nc] = dis[cur.first][cur.second] + 1; if (map[nr][nc] == 1) homeCnt++; } } return -1; } bool cont() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (dis[i][j] == 0 && map[i][j] == 1) return true; } } return false; } int main(void) { setbuf(stdout, NULL); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin >> T; //크기별 운용비용 미리 계산 for (int i = 1; i <= 42; i++) oprFee[i] = i * i + (i - 1) * (i - 1); for (int t = 1; t <= T; t++) { int totalHome = 0; cin >> n >> pay; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { cin >> map[i][j]; if (map[i][j] == 1) totalHome++; } int Max = 0; int maxPay = totalHome * pay; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 1; k < 43; k++) { int retHome = bfs({ i, j }, k); //계산 if (retHome * pay - oprFee[k] >= 0) if (retHome > Max) Max = retHome; //최대로 벌수있는 돈보다 운용 비용이 더 많이들면 break if (maxPay < oprFee[k]) { initVis(); break; } initVis(); } } } cout << "#" << t << ' ' << Max << '\n'; } return 0; } | cs |
'알고리즘 문제 풀이 > 삼성 SW Expert Academy' 카테고리의 다른 글
SWEA 1767: 프로세서 연결하기 (C++) (0) | 2019.10.17 |
---|---|
SWEA 5653:줄기세포배양 (C++) (0) | 2019.10.16 |
SWEA 2382: 미생물 격리 (C++) (0) | 2019.10.16 |
SWEA 2383: 점심 식사시간 (C++) (0) | 2019.10.15 |
SWEA 4014: 활주로 건설 (C++) (0) | 2019.10.15 |