BOJ 4963. ์ฌ์ ๊ฐ์
๐โโ๏ธ[Silver II] ์ฌ์ ๊ฐ์ - 4963
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2044 KB, ์๊ฐ: 0 ms
๋ถ๋ฅ
๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์, ๊น์ด ์ฐ์ ํ์
์ ์ถ ์ผ์
2024๋ 2์ 5์ผ 23:40:11
๋ฌธ์ ์ค๋ช
์ ์ฌ๊ฐํ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ ์ฌ๊ณผ ๋ฐ๋ค ์ง๋๊ฐ ์ฃผ์ด์ง๋ค. ์ฌ์ ๊ฐ์๋ฅผ ์ธ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํ ์ ์ฌ๊ฐํ๊ณผ ๊ฐ๋ก, ์ธ๋ก ๋๋ ๋๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ฌ๊ฐํ์ ๊ฑธ์ด๊ฐ ์ ์๋ ์ฌ๊ฐํ์ด๋ค.
๋ ์ ์ฌ๊ฐํ์ด ๊ฐ์ ์ฌ์ ์์ผ๋ ค๋ฉด, ํ ์ ์ฌ๊ฐํ์์ ๋ค๋ฅธ ์ ์ฌ๊ฐํ์ผ๋ก ๊ฑธ์ด์ ๊ฐ ์ ์๋ ๊ฒฝ๋ก๊ฐ ์์ด์ผ ํ๋ค. ์ง๋๋ ๋ฐ๋ค๋ก ๋๋ฌ์ธ์ฌ ์์ผ๋ฉฐ, ์ง๋ ๋ฐ์ผ๋ก ๋๊ฐ ์ ์๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์ง๋์ ๋๋น w์ ๋์ด h๊ฐ ์ฃผ์ด์ง๋ค. w์ h๋ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์์ด๋ค.
๋์งธ ์ค๋ถํฐ h๊ฐ ์ค์๋ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค. 1์ ๋ , 0์ ๋ฐ๋ค์ด๋ค.
์ ๋ ฅ์ ๋ง์ง๋ง ์ค์๋ 0์ด ๋ ๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์, ์ฌ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
BFS๋ฅผ ์ด์ฉํด์ ํ์๋ค.
๋น์ทํ ์ ํ์ด ๋ง์์ ์ฝ๊ฒ ํ ์ ์์๋ค.
๋๊ฐ์ ๊น์ง ๊ณ ๋ คํด์ผํ๋ ๋ฌธ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก dy, dx๋ฅผ ์๋์ ๊ฐ์ด ๋ง๋ค์๋ค.
int dy[] = { 0, -1, 0, 1, 1, 1, -1, -1 };
int dx[] = { 1, 0, -1, 0, 1, -1, 1, -1 };
BFS๋ ์๋์ ๊ฐ๋ค.
int w = -1, h = -1, res = 0;
int board[51][51];
int discovered[51][51];
int dy[] = { 0, -1, 0, 1, 1, 1, -1, -1 };
int dx[] = { 1, 0, -1, 0, 1, -1, 1, -1 };
void BFS(pair<int, int> here)
{
if (board[here.first][here.second] == 0)
return;
queue<pair<int, int>> q;
q.push(here);
if (board[here.first][here.second] == 1 && discovered[here.first][here.second] == 0)
res++;
discovered[here.first][here.second] = 1;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 8; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > h || nx > w)
continue;
if (discovered[ny][nx] == 1)
continue;
if (board[ny][nx] == 0)
continue;
q.push({ ny, nx });
discovered[ny][nx] = 1;
}
}
}
์ฌ์์ ๋ฐ๋ค๋ ๊ฑด๋์ผํ๋๊น BFS๋ฅผ ํ ๋ ๋ฐ๋ค๋ฉด ๋ฐ๋ก ๋๋๋ค.
๋ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ ๋๋ ์ฒซ ๋ฐ๊ฒฌ์ด๋ฉด์ ์ฌ์ด์ฌ์ผ res๊ฐ ์ฆ๊ฐํ๋ค.
solveํจ์๋ ์ด๋ ๊ฒ ๊ตฌํํ๋ค.
void solve()
{
while (true)
{
cin >> w >> h;
if (w == 0 && h == 0)
break;
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= w; ++j)
{
cin >> board[i][j];
}
}
::memset(discovered, 0, sizeof(discovered));
res = 0;
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= w; ++j)
{
BFS({ i, j });
}
}
cout << res << '\n';
}
}
w, h๊ฐ์ ์
๋ ฅ๋ฐ๊ณ board๋ฅผ ๊ทธ๋ฆฐ ๋ค์,
discovered๋ฅผ ์ด๊ธฐํํ๋ค.
board๋ฅผ ๋ชจ๋ ์ํํ๋ฉด์ ๊ฐ ์์น์ BFS๋ฅผ ๋ค ๋๋ฆฐ๋ค.
๊ทธ ํ res๋ฅผ ์ถ๋ ฅํ๋ฉด ์ ๋ต์ด๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
int w = -1, h = -1, res = 0;
int board[51][51];
int discovered[51][51];
int dy[] = { 0, -1, 0, 1, 1, 1, -1, -1 };
int dx[] = { 1, 0, -1, 0, 1, -1, 1, -1 };
void BFS(pair<int, int> here)
{
if (board[here.first][here.second] == 0)
return;
queue<pair<int, int>> q;
q.push(here);
if (board[here.first][here.second] == 1 && discovered[here.first][here.second] == 0)
res++;
discovered[here.first][here.second] = 1;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 8; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > h || nx > w)
continue;
if (discovered[ny][nx] == 1)
continue;
if (board[ny][nx] == 0)
continue;
q.push({ ny, nx });
discovered[ny][nx] = 1;
}
}
}
void solve()
{
while (true)
{
cin >> w >> h;
if (w == 0 && h == 0)
break;
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= w; ++j)
{
cin >> board[i][j];
}
}
::memset(discovered, 0, sizeof(discovered));
res = 0;
for (int i = 1; i <= h; ++i)
{
for (int j = 1; j <= w; ++j)
{
BFS({ i, j });
}
}
cout << res << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}