# LeetCode 2684. Maximum Number of Moves in a Grid https://leetcode.com/problems/maximum-number-of-moves-in-a-grid/description/ ## 題目大意 給定一個 $m \times n$ 的矩陣 `grid` 其中包含正整數 可以從矩陣的第一列中的任意一格開始,依以下方式遍歷矩陣: 從當前格 `(row, col)`,你可以移動到以下任一格:`(row - 1, col + 1)`、`(row, col + 1)` 和 `(row + 1, col + 1)`,前提是移動到的格的數值必須**嚴格大於**當前格的數值 回傳最多可以做幾動? ## 思考 ```cpp! class Solution { public: int maxMoves(vector<vector<int>> &grid) { const int m = grid.size(); const int n = grid.begin()->size(); bitset<1001> curr, next; for (int i = 0; i < m; ++i) { curr.set(i); } for (int j = 0; j < n - 1; ++j) { next.reset(); for (int i = 0; i < m; ++i) { if (curr[i]) { for (int k = i - 1; k <= i + 1; ++k) { if (k >= 0 && k < m && grid[i][j] < grid[k][j + 1]) next.set(k); } } } if (next.none()) return j; curr = next; } return n - 1; } }; ``` Go 參考解答: ```go! func maxMoves(grid [][]int) int { m := len(grid) n := len(grid[0]) curr := make([]bool, m) for i := 0; i < m; i++ { curr[i] = true } for j := 0; j < n-1; j++ { next := make([]bool, m) for i := 0; i < m; i++ { if curr[i] { for k := i - 1; k <= i+1; k++ { if k >= 0 && k < m && grid[i][j] < grid[k][j+1] { next[k] = true } } } } if !contains(next) { return j } curr = next } return n - 1 } func contains(arr []bool) bool { for _, val := range arr { if val { return true } } return false } ```