visited[x][y] = true; 不是「先假裝走過」,而是:
DFS 一進入 (x,y) 這格,就代表你現在已經走到這格了,所以立刻標記 true。
最小例子:
dfs(height, 0, 0, pacific);
一呼叫這行,就表示:
我現在已經到 (0,0) 了。
所以進到 dfs() 第一件事就是:
visited[0][0] = true;
至於你問「怎麼沒型別」,因為 visited 早就在參數這裡定義型別了:
vector<vector>& visited
所以裡面這行只是修改既有陣列內容,不是重新宣告變數。
你可以記成:
呼叫 dfs(x,y)
= 已經走到 (x,y)
→ 馬上 visited[x][y] = true
→ 再看四周下一步能不能走
不是「還沒開始走」,而是呼叫 DFS 的那一刻就已經抵達這格。
2.
vector<vector> pacificAtlantic(vector<vector>& height) {
拆開看:
vector<vector> // 回傳很多個 [x, y] 座標
pacificAtlantic // 函式名稱
(vector<vector>& height) // 輸入高度地圖
兩個海真正分開記在:
pacific
atlantic
最後才做:
pacific[x][y] && atlantic[x][y]
兩邊都能到的座標才放進答案。
int maxX, maxY; 是宣告變數;maxX = height.size(); 是把真正的值放進去。
最小例子:
int maxX; // 先說:我要一個整數變數叫 maxX
maxX = 5; // 再把 5 存進 maxX
這題也是一樣:
int maxX, maxY; // 先宣告
之後拿到 height 才知道大小:
maxX = height.size(); // 有幾列
maxY = height[0].size(); // 有幾欄
所以不是重複,而是:
先建立變數 → 後面再賦值。
class 建立
→ 先準備 maxX、maxY
pacificAtlantic 收到 height
→ 現在才知道 Grid 多大
→ maxX = height.size()
→ maxY = height[0].size()
dfs()
→ 可以直接使用 maxX、maxY
5.false 不是在比位置、也不是在檢查邊界;它只是把整張「Ocean 可達紀錄表」先初始化成「全部都還沒走到」。
6.dfs(height, 0, y, pacific);
dfs(height, maxX - 1, y, atlantic);
是在設定「上邊」和「下邊」的 DFS 起點。