###### tags: `APCS` # **4neighbors** ### **題目解析** 在一個5x5的二維陣列中,搜尋從給定起點出發的連續區域,並計算該區域內的元素個數。這類問題常見於圖形和網格資料結構的遍歷中,例如洪水填充演算法(Flood Fill)或連通分量的計算。這段程式碼將一個 1 視為區域的一部分,並使用深度優先搜索(DFS)來遍歷和標記所有相連的區域。 ### **解題方向** 1. 初始化: * 給定一個5x5的二維陣列arr,其中包含0和1。1表示可以通過的區域,而0表示不能通過的區域。 * 創建一個相同大小的marker陣列來標記已經訪問過的區域。 1. 深度優先搜索(DFS): * 使用遞迴函數search_map從指定的起始位置(2, 2)開始進行DFS遍歷。 * 在遞迴函數中,首先檢查邊界條件,確保座標(x, y)在陣列範圍內。 * 如果當前位置是1且未被標記,則標記該位置並向四個方向(上、下、左、右)遞迴搜尋。 1. 計算結果: * 搜尋完成後,遍歷marker陣列計算已標記為1的區域數量。 ### **完整程式碼** ```python= # 二維陣列,表示5x5的圖形 arr = [[1, 0, 0, 0, 1], [1, 0, 1, 0, 0], [0, 1, 1, 1, 0], [0, 0, 1, 1, 0], [1, 0, 0, 0, 0]] # 標記陣列,初始為全0,表示未訪問過 marker = [ [0, 0, 0, 0, 0] for x in range(5) ] # 深度優先搜索函數 def search_map(arr, marker, x, y): # 檢查是否在範圍外 if (x<0 or x>=5) or (y<0 or y>=5): return 0 # 如果當前元素是1且未被標記 elif arr[x][y] == 1 and marker[x][y] == 0: # 標記該位置 marker[x][y] = 1 # 遞迴搜尋四個方向 search_map(arr, marker, x-1, y) search_map(arr, marker, x+1, y) search_map(arr, marker, x, y-1) search_map(arr, marker, x, y+1) # 從(2, 2)開始搜尋 search_map(arr, marker, 2, 2) # 計算被標記為1的區域數量 c = 0 for i in range(5): for j in range(5): if marker[i][j] == 1: c += 1 print(c) # 輸出區域的大小 ```