https://www.acmicpc.net/problem/4963
풀이
여행을 갔다 오느라..오랜만에 문제를 풀었다!!근데 이건...예전에 풀었던 '2667번단지번호붙이기'와 매우 흡사하여 금방 풀었다.
map배열과 방문을 체크하는 visit배열을 선언 후
이중 반복문으로 map배열을 다 체크해주며 map의 해당 값이 1이며 방문한 적이 없는 곳이면 이 곳을 기준으로 상하좌우 대각선을 탐색해준다.
더 이상 이어진 섬이 없으면 return 1을 해주어 이 1의 총 합을 출력해주기만 하면 된다.
제출 코드
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 | #include <stdio.h> int H, W, num, map[60][60], visit[60][60]; int dx[] = { 0,1,1,1,0,-1,-1,-1 }; int dy[] = { -1,-1,0,1,1,1,0,-1 }; void reset(int *, int); int search(int y, int x) { if (!map[y][x]||visit[y][x]) return 0; visit[y][x] = 1; for (int i = 0; i < 8; i++) { int xx = x + dx[i]; int yy = y + dy[i]; if (map[yy][xx]&&!visit[yy][xx]) search(yy, xx); } return 1; } int main() { while (1) { num = 0; reset(map, sizeof(map) / 4); reset(visit,sizeof(visit) / 4); scanf("%d %d", &W, &H); if (W == 0 && H == 0) return 0; for (int i = 1; i <= H; i++) for (int j = 1; j <= W; j++) scanf("%d", &map[i][j]); for (int i = 1; i <= H; i++) { for (int j = 1; j <= W; j++) { num = search(i, j); } } printf("%d\n", num); } return 0; } void reset(int * arr, int size) { for (int i = 0; i < size; i++) arr[i] = 0; } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[BEAKJOON] 1063_킹_C언어 (0) | 2017.09.03 |
---|---|
[BAEKJOON] 1932_숫자삼각형_C언어 (0) | 2017.08.30 |
[BEAKJOON] 11052_붕어빵 판매하기_C언어 (0) | 2017.08.18 |
[BEAKJOON] 4883_삼각그래프_C언어 (0) | 2017.08.18 |
[BEAKJOON] 2688_줄어들지 않아_C언어_(11057 오르막수와 같음) (0) | 2017.08.17 |