题目描述
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。
输入
输入行数m,已经列数n。
然后输入*和@
输出
联通块个数
样例输入 Copy
5 5
****@
@@@
@**@
@@@@
@@**@
样例输出 Copy
2
package book;
import java.util.Scanner;
public class Oilfield {
static int res=0;
static int n,m;
static char array[][];
static int index[][];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();//行数
m=sc.nextInt();//列数
array=new char[n][m];
index=new int[n][m];
for(int i=0;i<n;i++) {
String s=sc.next();
System.out.println(s);
for(int j=0;j<m;j++) {
array[i][j]=s.charAt(j);//注意这里是输入的字符串
index[i][j]=0;
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(array[i][j]=='@'&&index[i][j]==0) {
slove(i,j,++res);
}
}
}
System.out.println(res);
}
private static void slove(int i, int j, int k) {
if(i<0||i>=n||j<0||j>=m) {
return;//超出限界
}
else if(index[i][j]>0||array[i][j]!='@') {
return;//同一片油田或者不是油田的地方
}
else {
index[i][j]=k;
for(int x=-1;x<=1;x++) {
for(int y=-1;y<=1;y++) {
if(x!=0||y!=0) {
slove(i+x,j+y,k);
}
}
}
}
}
}