티스토리 뷰
이번 문제도 DFS관련해서 풀은 문제입니다. 참고:(http://tiger1710.tistory.com/5)
밑에는 제 코드입니다.
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 | #include <stdio.h> #include <stdbool.h> #include <string.h> #define MAX 101 bool visited[MAX][MAX]; int N; void rgb(char grid[MAX][MAX],int r,int c) { visited[r][c] = true; if (r > 0 && grid[r][c] == grid[r - 1][c] && !visited[r - 1][c]) rgb(grid, r - 1, c); if (c > 0 && grid[r][c] == grid[r][c - 1] && !visited[r][c - 1]) rgb(grid, r, c - 1); if (r < N && grid[r][c] == grid[r + 1][c] && !visited[r + 1][c]) rgb(grid, r + 1, c); if (c < N && grid[r][c] == grid[r][c + 1] && !visited[r][c + 1]) rgb(grid, r, c + 1); } void rg(char grid[MAX][MAX],int r,int c) { visited[r][c] = true; if (r > 0 && (grid[r][c] == grid[r - 1][c] || grid[r][c] - grid[r - 1][c] == 'R' - 'G' || grid[r][c] - grid[r - 1][c] == 'G' - 'R') && !visited[r - 1][c]) rg(grid, r - 1, c); if (c > 0 && (grid[r][c] == grid[r][c - 1] || grid[r][c] - grid[r][c - 1] == 'R' - 'G' || grid[r][c] - grid[r][c - 1] == 'G' - 'R') && !visited[r][c - 1]) rg(grid, r, c - 1); if (r < N && (grid[r][c] == grid[r + 1][c] || grid[r][c] - grid[r + 1][c] == 'R' - 'G' || grid[r][c] - grid[r + 1][c] == 'G' - 'R') && !visited[r + 1][c]) rg(grid, r + 1, c); if (c < N && (grid[r][c] == grid[r][c + 1] || grid[r][c] - grid[r][c + 1] == 'R' - 'G' || grid[r][c] - grid[r][c + 1] == 'G' - 'R') && !visited[r][c + 1]) rg(grid, r, c + 1); } int main(void) { char grid[MAX][MAX]; int cnt = 0; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%s", grid[i]); } for (int r = 0; r < N; r++) { for (int c = 0; c < N; c++) { if (!visited[r][c]) { rgb(grid, r, c); cnt++; } } } printf("%d\n", cnt); cnt = 0; memset(visited, false, sizeof(visited)); for (int r = 0; r < N; r++) { for (int c = 0; c < N; c++) { if (!visited[r][c]) { rg(grid, r, c); cnt++; } } } printf("%d\n", cnt); return 0; } | cs |
9~16:문자열배열과 좌표를 받아서 그 좌표기준으로 상좌하우 순으로 탐색하는 코드입니다. 조건식은 좌표가 범위를 넘어가지않고, 인접한 글자가 같고, 방문하지 않았다면 그 좌표로 이동해서 다시 탐색을 하는 코드입니다.
18~25:위의 rgb함수와 같은 코드입니다. 달라진 것은 조건문에 R과 G를 같은 문자로 보는 조건을 추가한 것입니다.
44:cnt출력후 다시 0으로 초기화 해주고, memset함수로 방문체크하는 함수를 다시 false로 초기화해줍니다.
'Coding > acmicpc' 카테고리의 다른 글
백준 10451:순열 사이클 (0) | 2018.02.28 |
---|---|
백준 2583:영역 구하기 (0) | 2018.02.27 |
백준 2606:바이러스 (0) | 2018.02.23 |
백준 11724번:연결 요소의 갯수 (0) | 2018.02.23 |
백준 9012번:괄호 (4) | 2018.02.23 |