题目:
给你一个大小为 m x n 的整数矩阵 grid 和一个大小为 k 的数组 queries 。
找出一个大小为 k 的数组 answer ,且满足对于每个整数 queres[i] ,你从矩阵 左上角 单元格开始,重复以下过程:
- 如果
queries[i]严格 大于你当前所处位置单元格,如果该单元格是第一次访问,则获得 1 分,并且你可以移动到所有4个方向(上、下、左、右)上任一 相邻 单元格。 - 否则,你不能获得任何分,并且结束这一过程。
在过程结束后,answer[i] 是你可以获得的最大分数。注意,对于每个查询,你可以访问同一个单元格 多次 。
返回结果数组 answer 。
算法:
方法一:dfs
这个思路比较简单,但是TLE!
func maxPoints(grid [][]int, queries []int) []int {
ans := make([]int, len(queries))
row, col := len(grid), len(grid[0])
visited := make([][]int, row)
for i := range visited {
visited[i] = make([]int, col)
}
dicts := [][]int{[]int{1,0},[]int{-1,0},[]int{0,1},[]int{0,-1}}
var dfs func(i, j, target, visitFlag int) int
dfs = func(i, j, target, visitFlag int) int {
if 0 <= i && i < row && 0 <= j && j < col && visited[i][j] != visitFlag && grid[i][j] < target {
visited[i][j] = visitFlag
count := 1
for _, dict := range dicts {
x := dict[0] + i
y := dict[1] + j
count = count + dfs(x, y, target, visitFlag)
}
return count
}
return 0
}
for k := range queries {
ans[k] = dfs(0, 0, queries[k], k + 1)
}
return ans
}
方法二: