[백준] 1012 유기농배추

Dragony·2020년 2월 18일
0

코딩테스트

목록 보기
17/29

[백준1012]유기농배추

[백준2267]단지번호붙이기 문제와 유사한 문제였다.

오탈자를 줄이고 모듈화 시켜서 푸는 방식으로 가야겠다...ㅠㅠ
오타때문에 계속 런타임 에러나서 뭘까 뭘까 하다가
디버깅 하면서 보니까 dy[]={0,0 -1,1}로 했다는....


#include <iostream>
#include <queue>
#include <algorithm>
#include <string.h>
using namespace std;

//각 케이스테스트마다 입력받으므로 중복사용 x
int T, M, N, K;
int map[50][50];
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
//local에 넣어줘야함 각 케이스테스트 마다 초기화되야함
int visit[50][50];
int white;

void BFS(int x, int y) {

	queue<pair<int, int>> q;
	q.push(make_pair(x, y));
	visit[x][y] = 1;

	while (!q.empty()) {
		//큐의 가장 앞에 있는 노드 꺼내기
		int fx = q.front().first;
		int fy = q.front().second;
		q.pop();

		//현재 노드에 인접한 노드 탐색
		for (int i = 0; i < 4; i++) {
			int nx = fx + dx[i];
			int ny = fy + dy[i];

			//지도를 벗어나지 않고
			if (nx >= 0 && nx < N&&ny >= 0 && ny < M) {
				//배추가 있으면서 방문하지 않았다면 q에 push
				if (map[nx][ny] == 1 && visit[nx][ny] == 0) {
					q.push(make_pair(nx, ny));
					visit[nx][ny] = 1;
				}
			}
		}
	}

}

void solution() {

	white = 0;
	memset(map, 0, sizeof(map));
	memset(visit, 0, sizeof(visit));
	scanf("%d %d %d", &M, &N, &K);

	for (int j = 0; j < K; j++) {
		int x, y;
		scanf("%d %d", &x, &y);
		map[y][x] = 1;
	}

	//전체 지도 탐색
	for (int p = 0; p < N; p++) {
		for (int q = 0; q < M; q++) {
			//배추가 있는데 방문하지 않았다면 방문
			if (map[p][q] == 1 && visit[p][q] == 0) {
				white++;
				BFS(p, q);
			}
		}
	}
	cout << white << '\n';

}
int main() {
	scanf("%d", &T);

	for (int i = 0; i < T; i++) {
		solution();
	}


	return 0;
}
profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN