代码随想录60期day56
- 孤岛的总面积
//dfs #include<iostream> #include<vector> using namespace std;int dir[4][2] = {-1,0,0,-1,1,0,0,1};void dfs(vector<vector<int>>&grid, int x, int y ){grid[x][y] = 0;for(int i = 0 ; i < 4;i++){int nextx = x + dir[i][0];int nexty = y + dir[i][1];if(newtx < 0 || nextx >= grid.size() || nexty <0 || nexty >= grid[0].size()) continue;if(grid[nextx][nexty] == 0) continue;dfs(grid,nextx,nexty);}return; }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];}}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);}int count = 0;for(int i = 0 ; i<n;i++){for(int j = 0;j <m;j++){if(grid[i][j] ==1) count++;}}cout<<count<<endl; }
//bfs #include<iostream> #include<vector> #include<queue> using namespace std;int dir[4][2] = {-1,0,0,-1,1,0,0,1};void bfs(vector<vector<int>>&grid, 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 || nextx >= grid.size() || nexty <0 || 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];}}for(int i = 0;i<n;i++){if(grid[i][0] == 1) bfs(grid,i,0);if(grid[i][m-1] ==1) bfs(grid,i,m-1);}for(int j = 0;j<m;j++){if(grid[0][j] ==1) bfs(grid,0,j);if(grid[n-1][j] == 1) bfs(grid,n-1,j);}int count = 0;for(int i = 0 ; i<n;i++){for(int j = 0;j <m;j++){if(grid[i][j] ==1) count++;}}cout<<count<<endl; }
102 沉没孤岛
#include<iostream> #include<vector> using namespace std;int dir[4][2] = {-1,0,0,-1,1,0,0,1}; void dfs(vector<vector<int>>&grid,int x,int y){grid[x][y] = 2;for(int i = 0 ; i<4;i++){int nextx = x + dir[i][0];int nexty = y + dir[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if(grid[nextx][nexty] == 0 || grid[nextx][nexty] == 2) continue;dfs(grid,nextx,nexty);} }int main(){int n,m;cin>>n>>m;vecotr<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];}}// leftmost,rightmost ->middlefor(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);}// uppermost,bottommost ->middlefor(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) grid[i][j] =0;if(grid[i][j] ==2) grid[i][j] =1;}}for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){cout<<grid[i][j]<<" ";}}cout<<endl; }
- 水流问题
#include<iostream> #include<vector> using namespace std; int n,m;int dir[4][2] = {-1,0,0,-1,1,0,0,1};void dfs(vector<vector<int>>&grid, vector<vector<boo>>&visited, int x, int y){if(visited[x][y]) return;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 || nextx >=n || nexty < 0 || nexty >=m) continue;if(grid[x][y] >grid[nextx][nexty]) continue;dfs(grid,visited,nextx,nexty);}return; }int main(){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>>firstBorder(n,vector<bool>(m,false));vector<vector<bool>secondBorder(n,vector<bool>(m,false));for(int i = 0;i<n;i++){dfs(grid,firstBorder,i,0);dfs(grid,secondBorder,i,m-1);}for(int j = 0;j<m;j++){dfs(grid,firstBorder,0,j);dfs(grid,secondBorder,n-1,j);}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {// 如果这个节点,从第一组边界和第二组边界出发都遍历过,就是结果if (firstBorder[i][j] && secondBorder[i][j]) cout << i << " " << j << endl;;}}}
104.建造最大岛屿
#include<iostream> #include<vector> #include<unordered_set> #include<unordered_map>using namespace std; int n,m; int count;int dir[4][2] = {0,1,1,0,-1,0,0,1};void dfs(vecotr<vector<int>>&grid,vector<vector<bool>>&visited,int x,int y,int mark){if(visited[x][y] || grid[x][y] == 0) return;visited[x][y] = true;grid[x][y] = mark;count++;for(int i = 0;i<4;i++){int nextx = x + dir[i][0];int nexty = y + dir[i][1];if(nextx < 0 || nextx >= n || nexty < 0 || nexty >=m) continue;dfs(grid,visited,nextx,nexty,mark);} }int main() {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));unordered_map<int,int>gridNum;int mark = 2;bool isAllGrid = true;for(int i = 0; i<n;i++){for(int j = 0;j<m;j++){if(grid[i][j]) isAllGrid = false;if(!visited[i][j] && grid[i][j] == 1){count = 0;dfs(grid,visited,i,j,mark);gridNum[mark] = count;mark++;}}}if(isAllGrid){cout<<n*m<<endl;return 0;}int result = 0;unordered_set<int>visitedGrid;for(int i = 0;i<n;i++){for(int j = 0; j<m;j++){count = 1;visitedGrid.clear();if(grid[i][j] == 0){for(int k = 0 ; k<4;k++){int neari = i + dir[k][1];int nearj = j + dir[k][0];if(neari < 0 || neari >=0 || nearj<0 || nearj >=m) continue;if(visitedGrid.count(grid[neari][nearj])) continue;count+= gridNum[grid[neari][nearj]];visitedGrid.insert(grid[neari][nearj]);}}result = max(result,count);}}cout<<result<<endl; }