leetcode 1219-黄金矿工 C++

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。
为了使收益最大化,矿工需要按以下规则来开采黄金:

  • 每当矿工进入一个单元,就会收集该单元格中的所有黄金。
  • 矿工每次可以从当前位置向上下左右四个方向走。
  • 每个单元格只能被开采(进入)一次。
  • 不得开采(进入)黄金数目为 0 的单元格。、
  • 矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。

思路:带有记忆的DFS回溯法

class Solution {
public:
	int getMaximumGold(vector<vector<int>>& grid) {
		int rows = grid.size();
		int cols = grid[0].size();
		int max = 0;
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				maxGold(grid, rows, cols, i, j, 0, max);   //以矩阵中的每个节点为起点,遍历一遍符合条件的结果,用max存储所有符合条件的值中的最大值
			}
		}
		return max;
	}
	void maxGold(vector<vector<int>>& grid, int rows, int cols, int x, int y, int count,int& max) {
		if (x < 0 || x >= rows || y < 0 || y >= cols || grid[x][y] == 0)  //判断输入状态是否非法
			return;

		int tmp = grid[x][y];
		grid[x][y] = 0;  
		count += tmp;    //存储每一次遍历的结果和
		if (max < count) max = count;   //存储矩阵路径的最大值
		int X[4] = { 1,0,-1,0 };  //下右上左
		int Y[4] = { 0,1,0,-1 };
		for (int i = 0; i < 4; i++) 
			maxGold(grid, rows, cols, x + X[i], y + Y[i], count, max);  //递归上下左右遍历所有可能出现的情况
		grid[x][y] = tmp;  //回溯到上一步
	}
};

你可能感兴趣的:(回溯,C++)