BOJ:2667 (๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ) ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉด, ์กฐ๊ธ๋ง ์์ฉํด์ ์ฝ๊ฒ ํ ์ ์๋ค.
์ด ๋ฌธ์ ์์๋, ์ฌ์ด ์์ผ๋ฉด 1๋ก ํ์ํ๋๋ฐ, graph[x][y] ๊ธฐ์ค์ผ๋ก ๋ค์์ 8๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ฑธ์ด์ ๊ฐ ์ ์๋ ๊ฒฝ๋ก๋ก ๊ฐ์ฃผํ๋ค.
x-1 y-1
x-1 y
x-1 y+1
x y-1
x y+1
x+1 y-1
x+1 y
x+1 y+1
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์์ 8๊ฐ์ง ๊ฒฝ์ฐ์ graph[x][y]์์ x์ขํ์ y์ขํ๊ฐ ๊ฐ์ง ์ ์๋ ์๋ฅผ ๋ํ๋ผ ์ ์๋ค.
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
8๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก DFS ํจ์์์ nx = x + dx[i], ny = y + dy[i]๋ก ๋ค์ ๋ฐฉ๋ฌธํ ์ ์ ์ ์ ํ๊ณ , ๋ง์ฝ 1์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด DFS ํจ์๋ฅผ ํธ์ถํด์ ๋ฐฉ๋ฌธํ๋ค. ์ฌ๊ทํจ์๋ฅผ ํตํด ๊ตฌํํ DFS ํ์์ด๋ค.
์ฒ์ ๋ฐฉ๋ฌธํ๋ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ์์ํด์ 1์ ๊ฐ์ ๊ฐ์ง๋ ๋ชจ๋ ์ฐ๊ฒฐ๋ ๊ฒฝ๋ก ๋ฐฉ๋ฌธ์ด ๋๋๋ฉด main ํจ์์์ ๊ฐ์ฅ ๋จผ์ DFS ํจ์๋ฅผ ํธ์ถํ main ํจ์๋ก ๋ฆฌํดํ๋ค. ๋ฆฌํด ํ count๋ฅผ ์ฆ๊ฐ์์ผ์ ํ๋์ ์ฌ์ ๋ฐฉ๋ฌธํ์์ ๋ํ๋ธ๋ค.
์ฒ์์๋ STL์ ์๋ ํจ์์ธ deque๋ฅผ ์ฌ์ฉํด์ graph๋ฅผ ๋ํ๋๊ณ , ์ดํ ์ผ๋ฐ 2์ฐจ์ ๋ฐฐ์ด๋ก๋ ๊ตฌํํด๋ดค๋ค.
#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int visited[50][50];
void DFS(int x, int y, deque<int> *graph, int w, int h){
visited[x][y] = 1;
for(int i=0; i<8; i++){
int nx = x + dx[i]; int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= h || ny >= w) continue;
if(graph[nx][ny] == 1 && !visited[nx][ny]) DFS(nx, ny, graph, w, h);
}
}
int main(){
while(true){
int w, h;
scanf("%d %d", &w, &h);
if(w == 0 && h == 0) break;
deque<int> graph[h];
int cnt=0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
int num; scanf("%d", &num);
graph[i].push_back(num);
visited[i][j] = 0;
}
}
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
if(graph[i][j] == 1 && !visited[i][j]) {
DFS(i, j, graph, w, h);
cnt++;
}
}
}
printf("%d\n", cnt);
}
}
#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int visited[50][50];
int graph[50][50];
void DFS(int x, int y, int w, int h){
visited[x][y] = 1;
for(int i=0; i<8; i++){
int nx = x + dx[i]; int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= h || ny >= w) continue;
if(graph[nx][ny] == 1 && !visited[nx][ny]) DFS(nx, ny, w, h);
}
}
int main(){
while(true){
int w, h;
scanf("%d %d", &w, &h);
if(w == 0 && h == 0) break;
int cnt=0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
int num; scanf("%d", &graph[i][j]);
visited[i][j] = 0;
}
}
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
if(graph[i][j] == 1 && !visited[i][j]) {
DFS(i, j, w, h);
cnt++;
}
}
}
printf("%d\n", cnt);
}
}