题解 | #机器人的运动范围#

机器人的运动范围

http://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8

将上下左右四个方向,可以简化为往右或者往下,因为机器人是从[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);
		}
	}

};
全部评论

相关推荐

05-30 13:04
已编辑
门头沟学院 算法工程师
智谱和米哈游都是ai大模型agent的业务钱的话还是米更多,几乎翻倍了,有没有老哥是两个公司其中一个的,能问问转正率咋样嘛,我问的hr回答都是做的好就可以转正暑期实习
码农索隆:选米哈游:短期高薪、敢承担风险、具备强创新能力,且愿押注游戏AI赛道。 选智谱:稳定性与行业通用能力积累,接受薪资差距以换取更稳妥的职业基础。
投递北京智谱华章科技等公司6个岗位 > 实习期间如何提升留用概率?
点赞 评论 收藏
分享
Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务