桐希奈娅子 level
获赞
0
粉丝
0
关注
0
看过 TA
2
南昌航空大学
2026
Java
IP属地:江西
暂未填写个人简介
私信
关注
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];//        若下一个节点的高度小于当前节点的高度,则continueif (nextx < 0 || nexty < 0 || nexty >= m || nextx >= n || graph[nextx][nexty] < graph[x][y]) {continue;}dfs(visited, nextx, nexty);}}}
0 点赞 评论 收藏
分享
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 [][] visited;static int [] dx={1,0,-1,0};static int [] dy={0,1,0,-1};static int result;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();graph = new int[n][m];visited = 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(0,i);}for (int i = 0; i <n ; i++) {dfs(i,m-1);}for (int i = 0; i <m ; i++) {dfs(n-1,i);}for (int i=0;i<n;i++){dfs(i,0);}//如果没访问过且是陆地,则变为海洋for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if(graph[i][j]==1&&visited[i][j]!=1){graph[i][j]=0;}}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {System.out.print(graph[i][j]+" ");}System.out.println();}}//将连接的岛屿标记static void dfs(int x,int y){if (graph[x][y]==0||visited[x][y]==1) {return;}visited[x][y]=1;for (int i = 0; i <4 ; i++) {int nextx=dx[i]+x;int nexty=dy[i]+y;if (nextx<0||nexty<0||nexty>=m||nextx>=n){continue;}dfs(nextx,nexty);}}}
0 点赞 评论 收藏
分享
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 [][] visited;static int [] dx={1,0,-1,0};static int [] dy={0,1,0,-1};static int result;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();graph = new int[n][m];visited = 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(0,i);}for (int i = 0; i <n ; i++) {dfs(i,m-1);}for (int i = 0; i <m ; i++) {dfs(n-1,i);}for (int i=0;i<n;i++){dfs(i,0);}//递归搜索后,剩下还为1的必然不与边界相连for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (graph[i][j]==1){result++;}}}System.out.println(result);}//将连接的岛屿变成海洋static void dfs(int x,int y){if (graph[x][y]==0) {return;}graph[x][y]=0;for (int i = 0; i <4 ; i++) {int nextx=dx[i]+x;int nexty=dy[i]+y;if (nextx<0||nexty<0||nexty>=m||nextx>=n){continue;}dfs(nextx,nexty);}}}
0 点赞 评论 收藏
分享
02-01 21:02
已编辑
南昌航空大学 Java
import java.util.*;public class Main {static int n,m;static  int [][]graph; //图static int [][]visited; //是否访问static Deque<int[]> deque; //广搜队列//向量static int dx[]={-1,0,1,0};static int dy[]={0,1,0,-1};static int result=0;  //结果public static void main(String[] args) {Scanner in=new Scanner(System.in);n=in.nextInt();m=in.nextInt();graph =new int [n][m];visited =new int [n][m];deque =new ArrayDeque<>();for (int i = 0; i <n ; i++) {for (int j = 0; j <m ; j++) {graph[i][j]=in.nextInt();}}//遍历图,当找到合法陆地的时候送入搜索逻辑for (int i = 0; i < n; i++) {for (int j = 0; j <m ; j++) {if (graph[i][j]==1&&visited[i][j]!=1){result++;//深搜与广搜二选一//                     dfs(i,j);bfs(i,j);}}}System.out.println(result);}//bfsstatic void bfs(int x,int y){//初始元素入队deque.offer(new int[]{x,y});visited[x][y]=1;//将节点的上下左右送入队列并判断合法性while (!deque.isEmpty()){int [] cur=deque.poll();for (int i = 0; i <4 ; i++) {int nextx=dx[i]+cur[0];int nexty=dy[i]+cur[1];//发生越界,已访问或者是水地则continueif (nextx<0||nextx>=n||nexty<0||nexty>=m||graph[nextx][nexty]==0||visited[nextx][nexty]==1) {continue;}visited[nextx][nexty]=1;deque.offer(new int[]{nextx,nexty});}}}//递归逻辑,找到相连的陆地并标记访问过,直到碰到水和访问过的陆地则返回static void dfs(int x,int y){//当碰到水或者已经是拜访过的陆地就终止if(visited[x][y]==1||graph[x][y]==0){return;}visited[x][y]=1;for (int i = 0; i <4; i++) {int nextx=dx[i]+x;int nexty=dy[i]+y;if(nextx<0||nextx>=n||nexty<0||nexty>=m){continue;}dfs(nextx,nexty);//由于并不需要记录路径,所以不需要回溯}}}
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务