【剑指offer66 机器人的运动范围】
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
注意:机器人必须一格一格走,不能跨越不能到达的区域
class Solution { int get(int x) { //返回各位数值之和 int res=0; for (; x; x /= 10){ res += x % 10; } return res; } public: int movingCount(int k, int m, int n) { if(k<=0)return 0; if (!k) return 1; //k=0的情况 int vis[m][n] ; //记录是否可访问到 memset(vis,0,sizeof(vis)); int ans = 1; vis[0][0] = 1; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { //判断起点 以及 条件 if ((i == 0 && j == 0) || get(i) + get(j) > k) continue; //满足条件后 边界判断 判断机器人是否能够移动到此点 //只可能是从左边 或者上面过来的 所以只判断这两个方向可不可达就行 //if (i - 1 >= 0) vis[i][j] |= vis[i - 1][j]; //或 等于 做或运算 //if (j - 1 >= 0) vis[i][j] |= vis[i][j - 1]; if (i - 1 >= 0 && vis[i-1][j])vis[i][j]=1; if (j - 1 >= 0 && vis[i][j-1])vis[i][j]=1; ans += vis[i][j]; //如果不可达 自然为0 } } return ans; } };