โท ๋ฌธ์ ์ค๋ช
0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ์ง๋(1์ ๋ , 0์ ๋ฐ๋ค)์์ ์ฌ์ ๊ฐ์๋ฅผ ํ์ํ๋ ๋ฌธ์
์, ํ, ์ข, ์ฐ, ๋๊ฐ์ ๋ฐฉํฅ์ ๋ ์ด ์๋ค๋ฉด ์ฌ์ผ๋ก ํ๋จ.
์ง๋์ ๊ฐ๋ก, ์ธ๋ก๋ก 0 0์ด ์ ๋ ฅ๋ ๋๊น์ง ์ง๋ ์ ๋ ฅ๊ณผ ์ ๋ต ์ถ๋ ฅ์ ๋ฐ๋ณตํ๋ค.
โท ๋ฌธ์ ํ์ด
์ง๋์ขํ (0, 0)์์ ๋ถํฐ ํ์ฌ ์์น๊ฐ ๋ ์ธ์ง ํ๋จํ๊ณ ๋ ์ด๋ฉด ํ์์ ์์ํ๋ค.
ํ์์ ์, ํ, ์ข, ์ฐ, ๋๊ฐ์ ์ ์ฒดํฌํ์ฌ ์ง๋ ๋ฒ์๋ด์ด๊ณ 1๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ณณ๋ง ํ์ํ๋ค.
์ขํ๋ง ์ฎ๊ฒจ์ ํ์์ ๋ฐ๋ณตํ๋ฏ๋ก ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ DFS ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๋ค.
โท ์๊ฐ๋ณต์ก๋
2์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ง๋๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ๊ณ , ํ ์ขํ์์ ์ํ์ข์ฐ๋๊ฐ์ ๋ฐฉํฅ์ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ฏ๋ก
O(8N²) = O(N²)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
โท ์ฝ๋
#include <iostream>
#include <cstring> //memset
using namespace std;
const int MAX = 50;
void SearchMap(int, int);
int width, height; //๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ์ง๋์ ๊ฐ๋ก์ธ๋ก ํฌ๊ธฐ
int map[MAX][MAX]; //์ง๋๋ณ์
int visited[MAX][MAX]; //๋ฐฉ๋ฌธํ๋์ง ์ฒดํฌํ๋ ๋ณ์
int direction[8][2] = { {0,-1}, {0,1}, {-1,0}, {1,0}, {-1,-1}, {-1,1}, {1,-1}, {1,1} }; //์, ํ, ์ข, ์ฐ, ๋๊ฐ์
int main() {
while(1) {
cin >> width >> height;
if (width == 0 && height == 0) break; //0, 0 ์ด๋ฉด ๋ง์ง๋ง ๊ฐ์ด๋ฏ๋ก ์ข
๋ฃ
//์ง๋ ์
๋ ฅ๋ฐ๊ธฐ
for (int i = 0; i < height; i++) { //ํ
for (int j = 0; j < width; j++) { //์ด
cin >> map[i][j];
}
}
//ํ์ gogo. ์ฌํ์ํ ๋๋ง๋ค ์ด๊ธฐํ
int count = 0;
memset(visited, false, sizeof(visited));
for (int i = 0; i < height; i++) { //ํ
for (int j = 0; j < width; j++) {//์ด
if (map[i][j] && !visited[i][j]) { //ํ์์น๊ฐ ์ฌ์ด๊ณ , ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด ํ์์น์์ ํ์ ์์
SearchMap(i, j);
count += 1;
}
}
}
cout << count << "\n";
}
}
void SearchMap(int x, int y) {
if (!map[x][y] || visited[x][y]) { //โ
ํ์ ํ๋ค๊ฐ ์ฌ์ด ์๋๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ง๋๋ฉด, ๋์ด์ ํ์ํ ํ์ ์์ผ๋๊น ๋ฐ๋ก ๋น ์ ธ๋๊ฐ์
return;
}
visited[x][y] = true;
for (int i = 0; i < 8; i++) { //์ํ์ข์ฐ๋๊ฐ์ ํ์
int dx = x + direction[i][0]; //x์ขํ
int dy = y + direction[i][1]; //y์ขํ
if (dx >= 0 && dx < height && dy >= 0 && dy < width) {// ์ํ์ข์ฐ๋ก ์ด๋ํ ๊ฐ์ด ์ง๋์ ๋ฒ์๋ฅผ ๋๋์ง ์ฒดํฌ
SearchMap(dx, dy);
}
}
}