안녕 세상아,

[c++/백준] 1012 유기농 배추 본문

백준

[c++/백준] 1012 유기농 배추

돈 많은 백수가 되고싶다 2023. 6. 12. 21:47

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

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

일반적인 그래프에 조건이 있는 문제였다. 

사실 이런 문제를 처음 풀어봐서 다른 사람 코드를 이해하는 것도 오래 걸렸다.

 

내가 이해한 자세한 설명은 코드에 적어놨다.

#include <iostream>
#include <cstring>		//memset 사용하기 위함
using namespace std;

int m, n, k;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
bool isVisited[51][51] = { false };
int map[51][51];

void dfs(int a, int b) {
	//상하좌우에 연결되어있으면 하나로 취급해주기 위함
	for (int i = 0; i < 4; i++) {
		if (isVisited[a + dx[i]][b + dy[i]] == false && map[a + dx[i]][b + dy[i]] == 1) {
			isVisited[a + dx[i]][b + dy[i]] = true;
			dfs(a + dx[i], b + dy[i]);
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int t;
	cin >> t;

	int cnt = 0;

	for (int i = 0; i < t; i++) {
		cin >> m >> n >> k;

		//인접 리스트 만들기
		for (int j = 0; j < k; j++) {
			int a, b;
			cin >> a >> b;
			map[a][b] = 1;
		}
		if (k == 1) {
			cout << 1 << '\n';
			continue;
		}
		//방문되지 않고, 배추가 심어져있을 때 dfs 돌리고 나오면 cnt++
		for (int x = 0; x < n; x++) {
			for (int y = 0; y < m; y++) {
				if (isVisited[y][x] == false && map[y][x] == 1) {
					dfs(y, x);
					cnt++;
				}
			}
		}
		cout << cnt << '\n';
		cnt = 0;	//cnt 초기화

		//메모리 초기화
		memset(isVisited, false, sizeof(isVisited));
		memset(map, 0, sizeof(map));
	}
	return 0;
}

이걸 또 템플릿으로 생각하고 맨날 풀어봐야할듯. 일단 지금은 이해하긴 했는데 안하다보면 또 까먹을 듯..

'백준' 카테고리의 다른 글

[c++/백준] 18870 좌표 압축  (0) 2023.06.16
[c++/백준] 4963 섬의 개수 (bfs)  (0) 2023.06.15
[c++/백준] 11279 최대 힙  (0) 2023.06.12
[c++/백준] 14889 스타트와 링크  (1) 2023.06.12
[c++/백준]1927 최소 힙  (1) 2023.06.10