bfs—水窪數目(挑戰程序書33頁)

題目:在這裏插入圖片描述
在這裏插入圖片描述
從任意的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);
					}
				}
			}
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章