leetcode 1219 黄金矿工
一、题目描述
二、解题思路
整体思路
遍历grid向量,当grid[i][j]!=0时,将(i,j)作为入口,调用dfs函数,更新全局变量,探索所有的可能。可以采用回溯+剪枝来解决这个问题。
具体思路
(1)函数功能:dfs函数用于从(i,j)位置开始,探索所有的矿道,并更新全局变量ret;
(2)函数体:
<1>按照上、右、下、左的顺序从起点位置(i,j)进行探索;设计dx、dy数组的详细原因可以参考leetcode 79 单词搜索-CSDN博客
<2>如果(x,y)没有越界,且未被访问,且grid[x][y]不为0(题目约束),就将visited[x][y]赋值为true,path+=grid[x][y],再以(x,y)为起点,调用dfs函数;
<3>更新ret,如果path>=ret,将ret赋值为path;
<4>最后恢复现场;
注意:执行完dfs函数后,除了全局变量ret,其它变量都恢复初始状态。相当于完成了一次深度优先遍历,找到了以(i,j)为起点的所有可能;
三、代码实现
class Solution {int m,n;vector<vector<bool>> visited;int path=0;int ret=0;
public:int getMaximumGold(vector<vector<int>>& grid) {m=grid.size();n=grid[0].size();visited.resize(m,vector<bool>(n,false));for(int i=0;i!=m;i++)for(int j=0;j!=n;j++){visited[i][j]=true;path+=grid[i][j];dfs(grid,i,j);//恢复visited[i][j]=false;path-=grid[i][j];}return ret;}//上、右、下、左int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};void dfs(vector<vector<int>>& grid,int i,int j){for(int k=0;k!=4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&!visited[x][y]&&grid[x][y]){visited[x][y]=true;path+=grid[x][y];dfs(grid,x,y);if(path>=ret) ret=path;//恢复现场visited[x][y]=false;path-=grid[x][y];}}}
};