백준 4963 섬의 개수(c++)

2022. 8. 4. 17:23·PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]

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

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

<코드>

#include <iostream>
#include <cstring>
#include <queue>
#define max 51
using namespace std;
int w,h,n,m;
int board[max][max];
bool visited[max][max] = {0};

int dir[8][2] = {{-1,0},{1,0},{0,-1},{0,1},{1,1},{-1,-1},{1,-1},{-1,1}}; //상하좌우 대각선 이동 
void dfs(int x,int y)
{
	for(int i=0;i<8;i++)
	{
		int sr = x + dir[i][0];
		int sc = y + dir[i][1];
		if(sr<0 || sc<0 || sr>h-1 || sc>w-1) continue;
		if(visited[sr][sc]) continue;
		if(!visited[sr][sc] && board[sr][sc]){
			visited[sr][sc] = true;
			dfs(sr,sc);
		}
		
	}
}
int main()
{
	while(cin>>w>>h)
	{
		int cnt = 0;
		if(w==0 && h==0) break;
		for(int i=0;i<h;i++){
			for(int j=0;j<w;j++){
				cin>>board[i][j];
			}
		}
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)
			{
				if(!visited[i][j] && board[i][j])
				{
					visited[i][j] = true;
					dfs(i,j);
					cnt++;
				}
			}
		}
		cout<<cnt<<'\n';
		memset(visited,0,sizeof(visited));
		memset(board,0,sizeof(board));
	}
}

<풀이과정>

이 문제는 flood fill의 응용 문제이다. 기존 flood fill의 알고리즘은 상하좌우로 이동할 수 있는지를 검사했지만, 이번 경우에는 대각선의 이동도 추가해줘야되기 때문에 연산을 4개 추가해줬다. [4][2]=>[8][2]로 추가해줬다.

 

저작자표시 비영리 변경금지 (새창열림)

'PS > 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]' 카테고리의 다른 글

백준 7562 나이트의 이동(c++)  (0) 2022.08.06
백준 1012 유기농 배추(c++)  (0) 2022.08.05
백준 11724 연결 요소의 개수(c++)  (0) 2022.08.04
백준 2606 바이러스(c++)  (0) 2022.08.03
백준 2178 미로 탐색(c++)  (0) 2022.08.03
'PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]' 카테고리의 다른 글
  • 백준 7562 나이트의 이동(c++)
  • 백준 1012 유기농 배추(c++)
  • 백준 11724 연결 요소의 개수(c++)
  • 백준 2606 바이러스(c++)
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (383)
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (22)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (92)
        • Effective Java (5)
        • Java Concept (20)
        • Spring (61)
        • Design Pattern (3)
      • Python (2)
      • Vscode (1)
      • DevOps (43)
        • AWS (27)
        • Git (7)
        • Docker (6)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (2)
        • MatJido (2)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백트래킹
    springboot
    정보처리기사 실기
    컴퓨터구조
    AWS
    너비 우선 탐색
    Spring
    sqld
    Wi-Fi
    다이나믹 프로그래밍
    dp
    Effective Java
    dfs
    docker
    메타코딩
    정보처리기사
    일본여행
    정보처리기사 필기
    이펙티브 자바
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
백준 4963 섬의 개수(c++)
상단으로

티스토리툴바