알고리즘/BOJ

[4963번] 섬의 개수

남현경 2018. 7. 24. 00:41


#include 
#include 

using namespace std;

int w, h, x, y;
int map[51][51];
bool visited[51][51];
int cnt;
int dx[] = { 1,-1,0,0,1,-1,1,-1};
int dy[] = { 0,0,1,-1,-1,-1,1,1};
queue Q;

void input() {
        //초기화
	cnt = 0;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			cin >> map[i][j]; visited[i][j] = false;
		}
	}
}

void solve(int _qx,int _qy) {
	Q.push(_qx); Q.push(_qy); visited[_qx][_qy] = 1;

	while (!Q.empty()) {
		int qx = Q.front(); Q.pop();  int qy = Q.front(); Q.pop();

		for (int i = 0; i < 8; i++) {
			x = qx + dx[i];
			y = qy + dy[i];
			if (x >= 0 && x < h && y >= 0 && y < w && map[x][y] == 1 && !visited[x][y]) {
				visited[x][y] = 1; Q.push(x); Q.push(y);
			}
		}
	}
}

int main() {
	while (1) {
		cin >> w >> h;
		if (w == 0 && h == 0) {
			break;
		}
		input();
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				if (map[i][j] == 1 && !visited[i][j]) {
					solve(i, j); cnt++;
				}
			}
		}
		cout << cnt << endl;
	}
	return 0;
}

2018.07.23 (월) 스터디 1회 BFS


이번 문제는 BFS.DFS를 사용해서 푸는 유형이었다. 주말에 삼성SDS문제를 풀 때 기억이 안 나서 꽤나 고생했던 문제였는데


이번에는 좀 더 집중을 해서 그런지 구현을 좀 더 할 수 있었다. 아쉬웠던 것은 Queue사용에 있어 아직 미숙하다는 점이다.


큰태오빠의 코드를 열심히 익혀서 내가 스스로 완벽하게 구현을 할 수 있을 때까지 노력해야겠다.