題目:
從任意的W開始,不停地把鄰接的部分用’.‘代替。1次dfs後與初始的這個W連接的所有W就都被替換成了’.’,因此直到圖中不再存在W爲止,總共進行dfs的次數就是答案。
8個方向總共對應了8中狀態轉移,每個格子作爲dfs的參數至多被調用一次,複雜度爲O(8xNxM)=O(NxM).
import java.util.Scanner;
public class dfs水窪數目 {
private static int n;
private static int m;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
char[][] a=new char[n][];
for(int i=0;i<n;i++) {//每次輸入一行
a[i]=sc.next().toCharArray();
}
int cnt=0;
for(int i=0;i<n;i++) {
for (int j = 0; j < m; j++) {
if(a[i][j]=='W') {//從有W的地方開始遍歷
dfs(a,i,j);//清除一個水窪
cnt++;
}
}
}
System.out.println(cnt);
}
private static void dfs(char[][] a, int i, int j) {
a[i][j]='.';//被替換成.,這樣就避免走重的現象
//循環遍歷8個方向,用這個循環表示移動,可能走一步,可能不動
for (int k = -1; k < 2; k++) {//-1,0,1
for (int l = -1; l < 2; l++) {//-1,0,1
if(k==0&&l==0) continue;//表示橫縱座標都沒有變
//判斷是否在邊界內部
if(i+k>=0&&i+k<=n-1&&j+l>=0&&j+l<=m-1) {
if(a[i+k][j+l]=='W') {
dfs(a,i+k,j+l);
}
}
}
}
}
}