https://www.acmicpc.net/problem/2583
좌표로 배열의 영역 표시하는 방법
ex) 0 2 4 4 일 때,
|
|
|
|
|
|
|
(1,0) |
(1,1) |
(1,2) |
(1,3) |
|
|
|
(2,0) |
(2,1) |
(2,2) |
(2,3) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(i = 1; i < 3; i++) ==> for(i = M-4; i < M-2; i++)
for(j = 0; j < 4; j++) ==> for(j = 0; j < 4; j++)
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 | #include<iostream> #include<vector> #include<algorithm> using namespace std; int M, N; int map[101][101]; int group[101][101]; vector<int> v; int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; int cnt = 0; void dfs(int x, int y) { group[x][y] = 1; for (int i = 0; i < 4; i++) { int mx = x + dx[i]; int my = y + dy[i]; if (mx >= 0 & mx < M && my >= 0 && my < N && !map[mx][my] && !group[mx][my]) { dfs(mx,my); cnt++; } } return; } int main(void) { int K; int li, lj, ri, rj; cin >> M >> N >> K; for (int i = 0; i < K; i++) { cin >> li >> lj >> ri >> rj; // 좌표로 배열의 공간 표시하기 for (int m = M - rj; m < M - lj; m++) { for (int n = li; n < ri; n++) { map[m][n] = 1; } } } for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { // map이 직사각형에 가려져 있지 않고 grouping이 되어있지 않은 경우 dfs if(!map[i][j] && !group[i][j]) { cnt = 1; dfs(i, j); v.push_back(cnt); } } } int num = v.size(); cout << num << '\n'; sort(v.begin(), v.end()); for(int i = 0; i < num; i++) cout << v[i] << ' '; return 0; } | cs |
'Problem > DFS' 카테고리의 다른 글
[백준알고리즘] 12100번 2048(EASY) (0) | 2019.01.06 |
---|---|
[백준알고리즘] 6603번 로또 (0) | 2018.12.03 |
[백준알고리즘] 4963번 섬의 개수 (0) | 2018.11.25 |
[백준알고리즘] 2636번 치즈 (0) | 2018.11.18 |
[백준알고리즘] 2606번 바이러스 (0) | 2018.11.15 |