本文最后更新于585 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
https://www.programmercarl.com/kamacoder/0103.%E6%B0%B4%E6%B5%81%E9%97%AE%E9%A2%98.html
1.本题按照代码随想录的思路逆向思维找到从边界逆流到中间的位置即可,一共两个区域,最终找到两个区域重叠的区域就是我们要求的位置,其实这几个题的dfs代码思路都差不多。
CPP
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = {1,0,0,1,0,-1,-1,0};
void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& 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 >= grid.size() || nexty < 0 || nexty >= grid[0].size())continue;
if(grid[x][y] > grid[nextx][nexty])continue;
dfs(grid, visited, 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];
}
}
vector<vector<bool>> firstBound(n, vector<bool>(m, false));
vector<vector<bool>> secondBound(n, vector<bool>(m, false));
for(int i = 0; i < n; i++){
dfs(grid, firstBound, i, 0);
dfs(grid, secondBound, i, m - 1);
}
for(int j = 0; j < m; j++){
dfs(grid, firstBound, 0, j);
dfs(grid, secondBound, n - 1, j);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(firstBound[i][j] && secondBound[i][j]){
cout << i << ' ' << j << endl;
}
}
}
}