2 条题解
-
2
也是一道经典宽搜题,字符形式不好计算位置 所以我取巧 把岛屿和海洋对应替换成 1 和 0 .
这道题的核心就在于 找到岛屿的时候 就把他以及附近的陆地全部标记成海洋 同时记录已经搜过(其实不用 但是如果记录的话 貌似减少时间)
同时 ans自加 算一个岛屿 如此下来就很简单了Code:
#include <iostream> #include <algorithm> #include <cstring> #include <queue> #define int long long using namespace std; const int N = 1050; typedef pair<int , int> PII; int n , m; int g[N][N] , d[N][N] , ans; bool ch[N][N]; queue<PII> q; void bfs(int x , int y) { q.push({x , y}); int dx[] = {1 , 0 , -1 , 0} , dy[] = {0 , 1 , 0 , -1}; while (!q.empty()) { int x = q.front().first , y = q.front().second; q.pop(); for (int i = 0 ; i < 4 ; i ++ ) { int xx = x + dx[i] , yy = dy[i] + y; if (xx >= 0 && xx < n && yy >= 0 && yy < m && !ch[xx][yy] && g[xx][yy] == 1) { ch[xx][yy] = true; g[xx][yy] = 1; q.push({xx , yy}); } } } } signed main() { cin >> n >> m; for (int i = 0 ; i < n ; i ++ ) { for (int j = 0 ; j < m ; j ++ ) { char temp; cin >> temp; if (temp == '#') g[i][j] = 1; else g[i][j] = 0; } } for (int i = 0 ; i < n ; i ++ ) { for (int j = 0 ; j < m ; j ++ ) { if (g[i][j] == 1 && !ch[i][j]) { ch[i][j] = true; bfs(i , j); ans ++; } } } cout << ans << endl; return 0; }
-
0
参考答案:
#include<iostream> using namespace std; typedef pair<int, int>PII; const int N = 1010, M = N * N; char g[N][N]; int st[N][N]; PII q[M]; int n, m; int res; void bfs(int i, int j) { int hh = 0, tt = 0; q[0] = { i,j }; st[i][j] = 1; int dx[] = { 0,0,-1,1 }, dy[] = { 1,-1,0,0 }; ++res; while (hh <= tt) { PII t = q[hh++]; for (int i = 0; i < 4; ++i) { int x = t.first + dx[i], y = t.second + dy[i]; if (x < 0 || x >= n || y < 0 || y >= m) continue; if (g[x][y] == '.') continue; if (st[x][y]) continue; st[x][y] = 1; q[++tt] = { x,y }; } } } int main() { cin >> n >> m; for (int i = 0; i < n; ++i) scanf("%s", g[i]); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if (g[i][j] == '#' && !st[i][j]) bfs(i, j); cout << res << endl; return 0; }
- 1
信息
- ID
- 92
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者