很厉害了,能指出潜在的风险点
点赞 评论

相关推荐

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);//由于并不需要记录路径,所以不需要回溯}}}
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务