问题描述:传送门。
基本思路:
看传送门里的思路好了,这里大体一致,只不过选择了DFS作为解法而已。
DFS的解法和BFS基本上一模一样,只不过使用了stack作为数据结构。
当然你可以编写更简单的递归形式,利用OS的call stack,不过那样做的缺点就是容易堆栈溢出。
AC代码:
#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>> GetNeighbor(pair<int, int> &v, vector<vector<char>> &grid) {
int x = v.first, y = v.second;
vector<pair<int, int>> result;
if (x > 0) result.push_back(make_pair(x - 1, y));
if (x < grid.size() - 1) result.push_back(make_pair(x + 1, y));
if (y > 0) result.push_back(make_pair(x, y - 1));
if (y < grid[0].size() - 1) result.push_back(make_pair(x, y + 1));
return result;
}
void DFS(int i, int j, vector<vector<char>> &grid) {
stack<pair<int, int>> s; // s中的元素是grid中的坐标
s.push(make_pair(i, j));
while (!s.empty()) {
auto v = s.top();
s.pop();
auto neighbors = GetNeighbor(v, grid);
for (auto neighbor : neighbors) {
if (grid[neighbor.first][neighbor.second] == '1') { // 利用gird元素值进行Hash
grid[neighbor.first][neighbor.second] = '0';
s.push(neighbor);
}
}
}
}
int numIslands(vector<vector<char>>& grid) {
int sum = 0;
int width = grid.size();
if (width == 0) { return 0; }
int height = grid[0].size();
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
if (grid[i][j] == '1') {
DFS(i, j, grid);
++sum;
}
}
}
return sum;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<char>> grid;
for (int i = 0; i < n; ++i) {
vector<char> chs;
for (int j = 0; j < m; ++j) {
char ch;
cin >> ch;
chs.push_back(ch);
}
grid.push_back(chs);
}
cout << numIslands(grid) << endl;
return 0;
}
其他经验
没有!我感觉我的搜索能力越来越强了。