티스토리 뷰

문제

https://www.acmicpc.net/problem/4963

풀이과정

2차원 배열에서 섬을 1이라고 했을 때 상하좌우와 대각선 4가지 경우를 다 검사하는 dfs를 구현해서 풀이했다. 앞에서 풀어본 단지번호붙이기를 풀어서 그런지 응용해서 풀 수 있었다.

소스코드

#include <iostream>

using namespace std;

int map[51][51];
int visited[51][51];
int dx[8] = { 0,0,1,-1,-1,-1,1,1 };
int dy[8] = { 1,-1,0,0,-1,1,-1,1 };
int w, h;

void dfs(int x,int y)
{
    visited[y][x] = 1;
    for (int k = 0; k < 8; k++)
    {
        int nx = x + dx[k]; int ny = y + dy[k];
        if (nx >= 0 && nx < w && ny >= 0 && ny < h)
        {
            if(map[ny][nx] == 1 && visited[ny][nx] == 0)
                dfs(nx, ny);
        }
    }

}
int main()
{

    while(true)
    {
        cin >> w >> h;

        if (w == 0 && h == 0) break;

        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                cin >> map[i][j];
                visited[i][j] = 0;
            }

        }

        int cnt = 0;

        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                if (visited[i][j] == 0 && map[i][j] == 1)
                {
                    dfs(j, i);
                    cnt++;
                }

            }
        }

        cout << cnt << "\n";
    }


    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 7576번 토마토  (0) 2018.02.07
[백준] 2178번 미로 탐색  (0) 2018.02.05
[백준] 1003번 피보나치 함수  (0) 2018.01.30
[백준] 1463번 1로 만들기  (0) 2018.01.25
[백준] 10448번 유레카 이론  (0) 2018.01.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함