https://www.acmicpc.net/problem/14502
문제를 복붙해서 올렸었는데 그냥 다시 캡처로 올려야지^^* 폰으로 볼 때 다 잘린다 ㅠㅠ
ㅎㅎㅎㅎ 이런 ㅎㅎㅎㅎㅎㅎㅎ
아 지금까지.. 나는 비주얼 콘솔창에서 깜빡이는 게 제출했을 때 제한시간 1초랑 같은 것인 줄 알았다..
그래서 문제의 예제 3번 돌릴 때 계속 오랜시간이 걸리길래 어떻게 하면 시간을 줄일 수 있나 한참 고민했는데... 결국에는 콘솔창에서 돌리는 시간이랑 문제의 시간제한 조건이랑은 다른 것이어서.... 그냥 제출해도 되는 것이었다 허무...
line 58 :: 나는 큐의 상태를 복원하기 위해 같은 큐를 하나를 더 만들어 덮어씌워주는 방식으로 하였다!
line 49 :: 그리고 map 배열은 바꿨다가 다시 되돌리기 힘들 것 같아 map 자체는 0에서 2로 변경하지 않고 지역변수인 visited 배열로만 제어하였다.
struct node 형식의 vector 쓴 거는.. 조금이라도 시간을 줄여보려고 애썼던 흔적... 결과적으로 쓸모는 크게 없었다 ㅠ
벽을 놓을 수 있는 공간(map == 0 인 공간)만 저장하여 vector에 넣어주어 map 전체로 반복문을 돌리는 것보다는 시간을 빠르게 하려고 했었다..
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 | #include<iostream> #include<queue> #include<vector> using namespace std; struct node { int x; int y; }; int N, M; int safe_zone = -3; int map[65][65]; queue<pair<int, int>> q; queue<pair<int, int>> cp_q; int dx[4] = { 0,0,-1,1 }; int dy[4] = { 1,-1,0,0 }; vector<node> v; int max_safe_zone = 0; void bfs() { bool visited[65][65] = { false }; int count = 0; while (!q.empty()) { int sz = q.size(); while (sz--) { int x = q.front().first; int y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int mx = x + dx[i]; int my = y + dy[i]; if (mx >= 0 && mx < N && my >= 0 && my < M) { if (map[mx][my] == 0 && !visited[mx][my]) { q.push(make_pair(mx, my)); visited[mx][my] = true; count++; } } } } } int local_safe_zone = safe_zone - count; if (max_safe_zone < local_safe_zone) max_safe_zone = local_safe_zone; q = cp_q; return; } void build_wall(int ord, int i, int j, int _count) { map[i][j] = 1; // 벽 3개를 세웠다. 바이러스 확산 if (_count == 3) { bfs(); return; } for (int i = ord+1; i < v.size(); i++) { if (map[v[i].x][v[i].y] == 0) { build_wall(i,v[i].x,v[i].y,_count+1); map[v[i].x][v[i].y] = 0; } } return; } int main(void) { int count = 0; cin >> N >> M; node nd; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> map[i][j]; if (map[i][j] == 0) { safe_zone++; nd.x = i; nd.y = j; v.push_back(nd); } if (map[i][j] == 2) { q.push(make_pair(i, j)); cp_q.push(make_pair(i, j)); } } } for (int i = 0; i < v.size()-2; i++) { build_wall(i,v[i].x, v[i].y, count + 1); map[v[i].x][v[i].y] = 0; } cout << max_safe_zone; return 0; } | cs |
'Problem > Brute force' 카테고리의 다른 글
[C/C++] BOJ 15683 :: 감시 (0) | 2019.01.13 |
---|---|
[백준알고리즘] 2309번 일곱난쟁이 (0) | 2018.11.26 |
[백준알고리즘] 14889번 스타트와 링크 (0) | 2018.11.13 |
[백준알고리즘] 14888번 연산자 끼워넣기 (0) | 2018.11.10 |
[백준알고리즘] 14500번 테트로미노 (0) | 2018.11.08 |