岛屿问题:高山流水
import javax.xml.transform.Result;
import java.util.Arrays;
import java.util.Scanner;
//若从每个点开始搜索,会导致时间复杂度过高,可以逆向思考,只从边界出发,看看能到达哪些点,能到达的点标记为访问
//从两个边界出发,用两个数组存各自能到达的节点,两个都到达的节点则是答案节点
public class Main {
static int n,m;
static int[][] graph;
static int [] dx={1,0,-1,0};
static int [] dy={0,1,0,-1};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
graph = new int[n][m];
// 两个边界的visited数组
int[][] first =new int[n][m];
int[][] second=new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
graph[i][j] = in.nextInt();
}
}
//遍历行
for (int i = 0; i <m ; i++) {
dfs(first,0,i);
dfs(second,n-1,i);
}
// 遍历列
for (int i=0;i<n;i++){
dfs(first,i,0);
dfs(second,i,m-1);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (second[i][j]==1&&first[i][j]==1) {
System.out.println(i+" "+j);
}
}
}
}
static void dfs( int [][]visited,int x,int y) {
if (visited[x][y] == 1) {
return;
}
visited[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nextx = x + dx[i];
int nexty = y + dy[i];
// 若下一个节点的高度小于当前节点的高度,则continue
if (nextx < 0 || nexty < 0 || nexty >= m || nextx >= n || graph[nextx][nexty] < graph[x][y]) {
continue;
}
dfs(visited, nextx, nexty);
}
}
}
import java.util.Arrays;
import java.util.Scanner;
//若从每个点开始搜索,会导致时间复杂度过高,可以逆向思考,只从边界出发,看看能到达哪些点,能到达的点标记为访问
//从两个边界出发,用两个数组存各自能到达的节点,两个都到达的节点则是答案节点
public class Main {
static int n,m;
static int[][] graph;
static int [] dx={1,0,-1,0};
static int [] dy={0,1,0,-1};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
graph = new int[n][m];
// 两个边界的visited数组
int[][] first =new int[n][m];
int[][] second=new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
graph[i][j] = in.nextInt();
}
}
//遍历行
for (int i = 0; i <m ; i++) {
dfs(first,0,i);
dfs(second,n-1,i);
}
// 遍历列
for (int i=0;i<n;i++){
dfs(first,i,0);
dfs(second,i,m-1);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (second[i][j]==1&&first[i][j]==1) {
System.out.println(i+" "+j);
}
}
}
}
static void dfs( int [][]visited,int x,int y) {
if (visited[x][y] == 1) {
return;
}
visited[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nextx = x + dx[i];
int nexty = y + dy[i];
// 若下一个节点的高度小于当前节点的高度,则continue
if (nextx < 0 || nexty < 0 || nexty >= m || nextx >= n || graph[nextx][nexty] < graph[x][y]) {
continue;
}
dfs(visited, nextx, nexty);
}
}
}
全部评论
相关推荐
点赞 评论 收藏
分享

