将上下左右四个方向,可以简化为往右或者往下,因为机器人是从[0][0]出发的 每到一个新的格子,就将visited[][]标记为true

用dfs走完所有格子,然后统计visited中true的个数,即为机器人能走的格子数,返回即可。

每个格子只检测一边,时间复杂度mn

需要一个visited数组记录每个格子的访问情况,空间复杂度mn

class Solution {
public:
	int movingCount(int threshold, int rows, int cols) {
		//初始化
		m_rows = rows; m_cols = cols; m_th = threshold; m_num = 0;
		for (int i = 0; i < rows; i++) {//初始化访问标记数组
			visited.emplace_back(vector<bool>());
			for (int j = 0; j < cols; j++)
				visited[i].emplace_back(false);
		}
		//
		dfs(0, 0);
		for (int i = 0; i < rows; i++) //统计为true的格子数
			for (int j = 0; j < cols; j++)
				if (visited[i][j])m_num++;
		
		return m_num;
	}
private:
	int m_th;//阈值
	int m_num=0;//能走的格子总数
	int m_rows, m_cols;//网格最大长度宽度
	vector<vector<bool>>visited;
	//判断某个格子符合阈值要求,符合则返回true
	bool is_LessOrEqual_to_mth(int x, int y) {
		int sum = 0;
		while (x != 0) {
			sum += x % 10;
			x /= 10;
		}
		while (y != 0) {
			sum += y % 10;
			y /= 10;
		}
		return (sum <= m_th);
	}
	void dfs(int x, int y) {
		visited[x][y] = true;
		//向右走
		if (y < m_cols - 1 && !visited[x][y + 1] &&  is_LessOrEqual_to_mth(x, y + 1)) {
			dfs(x, y + 1);
		}
		//向下走
		if (x < m_rows - 1 && !visited[x + 1][y] &&  is_LessOrEqual_to_mth(x + 1, y)) {
			dfs(x + 1, y);
		}
	}

};