岛屿计算----JAVA

问题连接:

牛客网.

代码:

// A code block
package xunlian;
import java.util.Scanner;
public class xunlian5 {
 public static int[][] find(int[][] net1,int[][] net2,int num,int i,int j){
  if(net1[i-1][j]!=0&&net2[i-1][j]==0) {
   net2[i-1][j]=num;
   net2=find(net1, net2, num, i-1, j);
   }
  if(net1[i+1][j]!=0&&net2[i+1][j]==0) {
   net2[i+1][j]=num;
   net2=find(net1, net2, num, i+1, j);
   }
  if(net1[i][j-1]!=0&&net2[i][j-1]==0) {
   net2[i][j-1]=num;
   net2=find(net1, net2, num, i, j-1);
   }
  if(net1[i][j+1]!=0&&net2[i][j+1]==0) {
   net2[i][j+1]=num;
   net2=find(net1, net2, num, i, j+1);
   }
  return net2;
 }
 public static int def(int[][] net1,int[][] net2,int row,int col){
  int num = 1;
 for(int i=1;i<row+1;i++) {
  for(int j=1;j<col+1;j++) {
   if(net1[i][j]==1&&net2[i][j]==0) {
    net2[i][j]=num;
    net2=find(net1, net2, num, i, j);
    num++;
   }
  }
 }
 return num;
}
 public static void main(String[] args) {
 Scanner input = new Scanner(System.in); 
 System.out.print("请输入矩阵的行和列(例如:5 5):");
 int row = input.nextInt();
 int col = input.nextInt();
 System.out.println("row:"+row+"  col:"+col);
 System.out.println("请输入矩阵:");
 int [][] mymay=new int [row+2][col+2];
 int [][] mymay1=new int [row+2][col+2];
 for(int i=1;i<=row;i++) {
  for(int j=1;j<=col;j++) {
   mymay[i][j]=input.nextInt();
   }
 }
 System.out.println("你输入的矩阵为:");
 for(int i=1;i<row+1;i++) {
  for(int j=1;j<col+1;j++) {
   System.out.print(mymay[i][j]+" ");
   }
  System.out.println("");
 }
 int num = def(mymay,mymay1,row,col);
 System.out.print("一共有:"+(num-1)+"个岛");
 }
}

思路:将输入矩阵net1的四周延拓一次,即3X3的矩阵变成5X5、4X4的矩阵变成6X6,并填充0,以便矩阵四边的上下左右检测,另创一个与延拓后等大且元素全为0的矩阵net2,作为检测岛屿的路径,将已检测过的坐标标记起来。即当net1[i][j]为岛屿时,检测net2[i][j]的值v,若v为0则说明该点为标注,若v=1,则为第一片岛屿,v=2,为第二片岛屿。

结果图:

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值