一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是相同数字则为同一细胞,如:阵列
有5个细胞,编写程序求给定矩形阵列的细胞个数(函数参数为:二维数组,数组行数,数组列数)。
思路:
1.先遍历数组,判断字符是否是0
2.字符不是0,就顺时针判断是否有相同的字符
3.判断是否是相同字符的同时,删除字符信息
代码示例:
package cn.edu.dgut.cell;
import java.util.Scanner;
public class Cell {
//String类的一个方法使用,用来实现字符的快速输入
public static String cell_1;
//用来实现组织细胞的输入
public static char[][] cell_2;
//用来清理细胞中已经遍历的数字,未初始化都是false
public static boolean[][] cell_3;
//定义长度,注意只有类成员才可以直接赋值
public static int row;
public static int col;
//定义细胞的数目
public static int num=0;
//clean方法用来实现对组织的遍历和清除
public static void clean(int x,int y) {
//如果条件满足,就结束
if(cell_3[x][y]==true)
return;
//修改对应位置为true
cell_3[x][y]=true;
//对这个位置的地方顺时针遍历
//向右遍历
if(y+1<col) {
if(cell_2[x][y+1]==cell_2[x][y])
clean(x,y+1);
}
//向下遍历
if(x+1<row) {
if(cell_2[x+1][y]==cell_2[x][y])
clean(x+1,y);
}
//向左遍历
if(y-1>=0) {
if(cell_2[x][y-1]==cell_2[x][y])
clean(x,y-1);
}
return;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//实例化行和列
System.out.println("请输入行和列");
row=sc.nextInt();
col=sc.nextInt();
cell_2=new char[row][col];
cell_3=new boolean[row][col];
//初始化组织
for (int i = 0; i < row; i++) {
System.out.println("输入序列");
cell_1=sc.next();
for (int j = 0; j < col; j++) {
cell_2[i][j]=cell_1.charAt(j);
}
}
//开始寻找细胞的数目
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if(cell_2[i][j]!='0'&&cell_3[i][j]==false) {
clean(i,j);
num++;
}
}
}
System.out.println("这个组织有"+num+"种细胞");
}
}
测试用例:
//每个测试用例包括两部分内容:输入矩阵(包括行数、列数、矩阵),输出
3,4 //3行4列
//矩阵
1 0 0 0
1 2 0 0
0 2 2 1
3 //输出结果
测试用例1
7,7
0 1 0 0 0 0 0
0 1 0 0 4 0 0
0 1 1 0 4 0 0
0 1 8 0 0 0 0
0 0 8 5 5 5 0
0 8 8 8 0 0 0
0 0 8 0 0 0 1
5
测试用例2
3,3
0 1 0
0 1 0
0 1 1
1
测试用例3
3,3
0 0 0
0 0 0
0 0 0
0
测试用例4
5,5
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1
测试用例5
5,5
1 1 1 1
1 0 1 1
0 1 0 1
1 1 1 1
1
测试用例6
1,10
0 1 0 0 0 0 0 0 0 1
2
测试用例7
10,1
0
1
0
0
1
1
0
0
0
0
2