问题描述:
样例输入:
**
**
代码如下:dfs解决
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//大西洋太平洋水流问题
public class PacificAtlantic {
//反向思考解决问题
public List<List<Integer>> pacificAtlantic(int[][] heights) {
int m = heights.length;
int n = heights[0].length;
int[][] ao = new int[m][n];//太平洋的节点记录矩阵
int[][] pa = new int[m][n];//大西洋的节点记录矩阵
//1. 从上下边界开始两大洋的回流搜索,变动的是列
for(int i=0;i<n;i++){//注意 非静态方法可以调用静态方法
dfs(heights,pa,0,i);
dfs(heights,ao,m-1,i);
}
//2. 从左右边界开始两大洋的回流搜索,变动的是行
for(int i=0;i<m;i++){
dfs(heights,pa,i,0);
dfs(heights,ao,i,n-1);
}
//3. 输出交叠的坐标
List<List<Integer>> cnt = new ArrayList<>();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(ao[i][j]==1&&pa[i][j]==1){
cnt.add(Arrays.asList(i,j));
}
}
}
return cnt;
}
public static void dfs(int[][] heights,int[][] tmp,int cur_i,int cur_j){
//递归出口
if (tmp[cur_i][cur_j]==1) return;
//标记可以从海洋流回经过的节点
tmp[cur_i][cur_j]=1;
//开始深度优先搜索当前坐标的4个方向
//1. 设置更新的坐标
int[] di=new int[]{1,-1,0,0};//上下移动
int[] dj=new int[]{0,0,1,-1};//左右移动
int new_i=0;
int new_j=0;
//2. 更新坐标并递归搜索
for(int index=0;index<4;index++){
new_i=cur_i+di[index];
new_j=cur_j+dj[index];
//判断下标是否越界
if(new_i<0||new_j<0||new_i>=heights.length||new_j>=heights[0].length){
continue;
}
if(heights[cur_i][cur_j]<=heights[new_i][new_j]&&tmp[new_i][new_j]!=1){
dfs(heights,tmp,new_i,new_j);
}
}
}
}