本文主要是介绍DAY52-图论BFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
kama101.孤岛的总面积
/*** 在外循环遇到没有标记过的岛屿+1* @param args*/public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();int[][] isoland = new int[n][m];boolean[][] path = new boolean[n][m];for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {isoland[i][j]=scan.nextInt();}}//初始化_把连着四周的陆地变为海洋for(int i=0;i<m;i++) {if(isoland[0][i]==1&&path[0][i]==false) {bfs0(isoland,path,0,i,n,m);}if(isoland[n-1][i]==1&&path[n-1][i]==false) {bfs0(isoland,path,n-1,i,n,m);}}for(int i=1;i<n-1;i++) {if(isoland[i][0]==1&&path[i][0]==false) {bfs0(isoland,path,i,0,n,m);}if(isoland[i][m-1]==1&&path[i][m-1]==false) {bfs0(isoland,path,i,m-1,n,m);}}for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {System.out.print(isoland[i][j]);}System.out.println();}//DFS搜索for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {if(isoland[i][j]==1&&path[i][j]==false) {bfs(isoland,path,i,j,n,m);}}}System.out.println(sum);scan.close();}public static int sum=0;public static int[][] step = {{1,0},{0,1},{-1,0},{0,-1}};/*** 初始化为0* @param isoland* @param path* @param x* @param y*/public static void bfs0(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;isoland[x][y]=0;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==1&&path[tempx][tempy]==false) {path[tempx][tempy]=true;isoland[tempx][tempy]=0;queue.add(new int[] {tempx,tempy});}}}}/*** 从哪个点开始广度搜索* @param isoland* @param path* @param x* @param y*/public static void bfs(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;sum++;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==1&&path[tempx][tempy]==false) {path[tempx][tempy]=true;sum++;queue.add(new int[] {tempx,tempy});}}}}
kama102.沉没孤岛
/*** 在外循环遇到没有标记过的岛屿+1* @param args*/public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();int[][] isoland = new int[n][m];boolean[][] path = new boolean[n][m];for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {isoland[i][j]=scan.nextInt();}}//初始化_把连着四周的陆地变为海洋for(int i=0;i<m;i++) {if(isoland[0][i]==1&&path[0][i]==false) {bfs(isoland,path,0,i,n,m);}if(isoland[n-1][i]==1&&path[n-1][i]==false) {bfs(isoland,path,n-1,i,n,m);}}for(int i=1;i<n-1;i++) {if(isoland[i][0]==1&&path[i][0]==false) {bfs(isoland,path,i,0,n,m);}if(isoland[i][m-1]==1&&path[i][m-1]==false) {bfs(isoland,path,i,m-1,n,m);}}//DFS搜索for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {if(isoland[i][j]==1&&path[i][j]==false) {bfs0(isoland,path,i,j,n,m);}}}for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {System.out.print(isoland[i][j]);if(j!=m-1) {System.out.print(" ");}}if(i!=n-1) {System.out.println(); }}scan.close();}public static int[][] step = {{1,0},{0,1},{-1,0},{0,-1}};/*** 初始化为0* @param isoland* @param path* @param x* @param y*/public static void bfs0(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;isoland[x][y]=0;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==1&&path[tempx][tempy]==false) {path[tempx][tempy]=true;isoland[tempx][tempy]=0;queue.add(new int[] {tempx,tempy});}}}}/*** 从哪个点开始广度搜索* @param isoland* @param path* @param x* @param y*/public static void bfs(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==1&&path[tempx][tempy]==false) {path[tempx][tempy]=true;queue.add(new int[] {tempx,tempy});}}}}
kama103.水流问题
/***从四周遍历获取两边都可以到达的地方* @param args*/public static void main(String[] args) {//获取岛屿数组Scanner scan = new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();int[][] isoland = new int[n][m];boolean[][] pathL = new boolean[n][m];boolean[][] pathR = new boolean[n][m];for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {isoland[i][j]=scan.nextInt();}}//遍历上边界和下边界for(int i=0;i<m;i++) {if(pathL[0][i]==false) {bfs(isoland,pathL,0,i,n,m);}if(pathR[n-1][i]==false) {bfs(isoland,pathR,n-1,i,n,m);}}//遍历左边界和右边界for(int i=0;i<n;i++) {if(pathL[i][0]==false) {bfs(isoland,pathL,i,0,n,m);}if(pathR[i][m-1]==false) {bfs(isoland,pathR,i,m-1,n,m);}}for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {if(pathL[i][j]==true&&pathR[i][j]==true) {System.out.println(i+" "+j);}}}scan.close();}public static int[][] step = {{1,0},{0,1},{-1,0},{0,-1}};/*** 从哪个点开始广度搜索* @param isoland* @param path* @param x* @param y*/public static void bfs(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]>=isoland[temp[0]][temp[1]]&&path[tempx][tempy]==false) {path[tempx][tempy]=true;queue.add(new int[] {tempx,tempy});}}}}
kama104.建造最大岛屿
/*** 遍历每个岛并编号、再遍历所有的0将0周围的所有值加起来* @param args*/public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();int[][] isoland = new int[n][m];boolean[][] path = new boolean[n][m];for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {isoland[i][j]=scan.nextInt();}}//BFS遍历for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {if(isoland[i][j]==1&&path[i][j]==false) {bfs0(isoland,path,i,j,n,m);hash.put(count, area);count++;area=0;}}}//会出现重复计算一个岛屿的问题int max=0;for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {//如果该位置是海洋if(isoland[i][j]==0) {int sub=0;set.clear();for(int k=0;k<4;k++) {int tempx=i+step[k][0];int tempy=j+step[k][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==0) continue;if(set.contains(isoland[tempx][tempy]))continue;sub=sub+hash.get(isoland[tempx][tempy]);set.add(isoland[tempx][tempy]);}sub++;if(sub>max)max=sub;}}}scan.close();//说明没有海洋部分,返回整个陆地部分if(max==0) {System.out.println(hash.get(2));return ;}System.out.println(max);}public static int[][] step = {{1,0},{0,1},{-1,0},{0,-1}};//编号与mappublic static Map<Integer,Integer> hash = new HashMap<>();public static Set<Integer> set = new HashSet<>();public static int count=2;public static int area=0;/*** 初始化为0* @param isoland* @param path* @param x* @param y*/public static void bfs0(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;isoland[x][y]=count;area++;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==1&&path[tempx][tempy]==false) {path[tempx][tempy]=true;isoland[tempx][tempy]=count;area++;queue.add(new int[] {tempx,tempy});}}}}/*** 从哪个点开始广度搜索* @param isoland* @param path* @param x* @param y*/public static void bfs(int[][] isoland,boolean[][] path,int x,int y,int n,int m) {LinkedList<int[]> queue = new LinkedList<>();queue.add(new int[]{x,y});path[x][y]=true;while(!queue.isEmpty()) {int[] temp = queue.remove();for(int i=0;i<4;i++) {int tempx=temp[0]+step[i][0];int tempy=temp[1]+step[i][1];//越界if(tempx<0||tempx>n-1||tempy<0||tempy>m-1) continue;if(isoland[tempx][tempy]==1&&path[tempx][tempy]==false) {path[tempx][tempy]=true;queue.add(new int[] {tempx,tempy});}}}}
这篇关于DAY52-图论BFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!