题目:101.孤岛的总面积
代码:
dfs:
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
int ans;
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
grid[x][y] = 0;
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
if(grid[nextx][nexty] == 1) dfs(grid, visited, nextx, nexty);
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<bool>>visited(n, vector<bool>(m, false));
//左
for (int i = 0; i < n; i++) {
if (grid[i][0] ) {
dfs(grid, visited, i, 0);
}
}
//右
for (int i = 0; i < n; i++) {
if (grid[i][m-1]) {
dfs(grid, visited, i, m - 1);
}
}
//上,下
for (int j = 0; j < m; j++) {
if (grid[0][j]) {
dfs(grid, visited, 0, j);
}
if (grid[n - 1][j]) {
dfs(grid, visited, n - 1, j);
}
}
int result = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) result++;
}
}
cout << result << endl;
}
bfs:
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
int ans;
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
queue<pair<int, int>>que;
que.push({ x,y });
grid[x][y] = 0;
while (!que.empty()) {
pair<int, int>cur = que.front();
que.pop();
int curx = cur.first;
int cury = cur.second;
for (int i = 0; i < 4; i++) {
int nextx = curx + dir[i][0];
int nexty = cury + dir[i][1];
if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
if (grid[nextx][nexty] == 1) {
que.push({ nextx,nexty });
grid[nextx][nexty] = 0;
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<bool>>visited(n, vector<bool>(m, false));
//左
for (int i = 0; i < n; i++) {
if (grid[i][0] ) {
bfs(grid, visited, i, 0);
}
}
//右
for (int i = 0; i < n; i++) {
if (grid[i][m-1]) {
bfs(grid, visited, i, m - 1);
}
}
//上,下
for (int j = 0; j < m; j++) {
if (grid[0][j]) {
bfs(grid, visited, 0, j);
}
if (grid[n - 1][j]) {
bfs(grid, visited, n - 1, j);
}
}
int result = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) result++;
}
}
cout << result << endl;
}
题目:102.沉没孤岛
链接:
102. 沉没孤岛 (kamacoder.com)
代码:
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
void dfs(vector<vector<int>>& grid, int x, int y) {
if (grid[x][y] == 0) return;
grid[x][y] = 0;
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
dfs(grid, nextx, nexty);
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<int>>grid_copy = grid;
for (int i = 0; i < n; i++) {
if (grid[i][0] == 1) dfs(grid, i, 0);
if (grid[i][m - 1] == 1) dfs(grid, i, m - 1);
}
for (int j = 0; j < m; j++) {
if (grid[0][j] == 1) dfs(grid, 0, j);
if (grid[n - 1][j] == 1) dfs(grid, n - 1, j);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
cout << 0 << ' ';
}
else {
cout << grid_copy[i][j] << ' ';
}
}
cout << endl;
}
}
题目:103.水流问题
链接:
103. 水流问题 (kamacoder.com)
代码:
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
queue<pair<int, int>>que;
que.push({ x,y });
visited[x][y] = true;
while (!que.empty()) {
pair<int, int>cur = que.front();
que.pop();
int curx = cur.first;
int cury = cur.second;
for (int i = 0; i < 4; i++) {
int nextx = curx + dir[i][0];
int nexty = cury + dir[i][1];
if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
if (grid[curx][cury] <= grid[nextx][nexty] && !visited[nextx][nexty]) {
visited[nextx][nexty] = true;
que.push({ nextx,nexty });
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<bool>>leftBoard(n, vector<bool>(m, 0));
vector<vector<bool>>rightBoard(n, vector<bool>(m, 0));
for (int i = 0; i < n; i++) {
bfs(grid, leftBoard, i, 0);
bfs(grid, rightBoard, i, m - 1);
}
for (int j = 0; j < m; j++) {
bfs(grid, leftBoard, 0, j);
bfs(grid, rightBoard, n - 1, j);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (leftBoard[i][j] && rightBoard[i][j]) {
cout << i << ' ' << j << endl;
}
}
}
}
题目104.建造最大的岛屿
链接:
104. 建造最大岛屿 (kamacoder.com)
代码:
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
int ans;
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y, int mark) {
if (visited[x][y] || grid[x][y] == 0) return;
grid[x][y] = mark;
visited[x][y] = true;
ans++;
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
dfs(grid, visited, nextx, nexty, mark);
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
int mark = 2;
bool isAllgrid = true;
unordered_map<int, int>myMap;
vector<vector<bool>>visited(n, vector<bool>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 0) isAllgrid = false;
if (grid[i][j] == 1 && !visited[i][j]) {
ans = 0;
dfs(grid, visited, i, j, mark);
myMap[mark] = ans;
mark++;
}
}
}
if (isAllgrid) {
cout << n * m << endl;
return 0;
}
int result = 0;
unordered_set<int>visited_grid;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = 1;
visited_grid.clear();
if (grid[i][j] == 0) {
for (int k = 0; k < 4; k++) {
int nextx = i + dir[k][0];
int nexty = j + dir[k][1];
if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
if (visited_grid.count(grid[nextx][nexty])) continue;
ans += myMap[grid[nextx][nexty]];
visited_grid.insert(grid[nextx][nexty]);
}
}
result = max(result, ans);
}
}
cout << result << endl;
}