|
输入: 第一行包含两个正整数 N 和 M,表示将一个园子地面分成N*M块方格,N 行,M列,接下来的 N 行描述了园子地面状况,其中‘W’表示积水的水洼,‘.’表示没有积水。N,M<=100。
输出: 仅一个数,表示水洼的总数。 |
输入示例: 10 12
输出示例: 3 |
思路:
采用dfs算法,从任意的‘w’开始,不停将其邻接的部分用 ‘.’ 代替。
每次dfs之后,与该‘w’邻接的 ‘w’都被替换成了'.',不断调用dfs,直到图中不存在‘w’为止。
总共进行dfs的次数就是水洼的个数。
import java.util.*;
public class Main{
static int n;
static int m;
static char [][]field;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
String []str=sc.nextLine().split(" ");
n=Integer.parseInt(str[0]);
m=Integer.parseInt(str[1]);
field=new char[n][];
int count=0;
for(int i=0;i<n;i++) {
field[i]=sc.nextLine().toCharArray();
System.out.println(field[i]);
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(field[i][j]=='w') {
dfs(i,j); //每次dfs就将其邻接的所有‘.’都替换完成
count=count+1;
}
}
}
System.out.println(count);
}
}
private static void dfs(int x,int y) {
field[x][y]='.';//先将该点替换为‘.’
for(int dx=-1;dx<=1;dx++) {
for(int dy=-1;dy<=1;dy++) {
int x1=x+dx;
int y1=y+dy;
if(x1>=0&&x1<n&&y1>=0&&y1<m&&field[x1][y1]=='w') {
dfs(x1,y1); //再将该点邻接的‘w’都替换为'.'
}
}
}
return;
}
}
参考:
挑战程序设计竞赛(第二版)人民邮电出版社