[C++]伯俊-#4963島の個数
問題の説明
入力
しゅつりょく
各テストボックスについて、島の個数を出力します.
解法
これは典型的なBFS/DFS問題である.
他の問題とは異なり,対角線方向まで上下左右ではなく8方向を考慮すべきである.
それ以外に、気を遣うところはありません.
ソースコード
確かに直感的に説明できるBFS問題は容易に解決できる.公式を暗記するように暗記するのではなく、潮流を理解することが重要です.
入力
しゅつりょく
各テストボックスについて、島の個数を出力します.
解法
これは典型的なBFS/DFS問題である.
他の問題とは異なり,対角線方向まで上下左右ではなく8方向を考慮すべきである.
それ以外に、気を遣うところはありません.
ソースコード
#include <bits/stdc++.h>
using namespace std;
int board[60][60];
bool vis[60][60];
#define X first
#define Y second
int dx[8] = { 1,0,-1,0,1,1,-1,-1};
int dy[8] = { 0,1,0,-1,1,-1,-1,1 };
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
while (1) {
cin >> m >> n;
int cnt = 0;
if (n == 0 && m == 0)
return 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
cin >> board[i][j];
vis[i][j] = 0;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (vis[i][j] || board[i][j] == 0) continue;
queue <pair<int, int>> Q;
cnt++;
Q.push({ i, j });
while (!Q.empty())
{
pair<int, int> cur = Q.front(); Q.pop();
for (int dir = 0; dir < 8; dir++)
{
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (vis[nx][ny] || board[nx][ny] != 1) continue;
vis[nx][ny] = 1;
Q.push({ nx, ny });
}
}
}
}
cout << cnt << "\n";
}
}
フィードバック確かに直感的に説明できるBFS問題は容易に解決できる.公式を暗記するように暗記するのではなく、潮流を理解することが重要です.
Reference
この問題について([C++]伯俊-#4963島の個数), 我々は、より多くの情報をここで見つけました https://velog.io/@josuncom/C-백준-4963-섬의-개수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol