[백준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;
}