问题连接:
牛客网.
代码:
// 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,为第二片岛屿。
结果图: