一开始没看清题目,没看到要一步一步移动,我以为是看所有格子中有几个格子符合条件,就直接遍历所有格子,把每个格子的i,j每个位数上的数相加看看是否小于k,是就给counts加一最后返回couts,我还说为什么中等题这么简单,原来看错了题。然后就直接看题解了。
class Solution {
public int movingCount(int m, int n, int k) {
if(k == 0)return 1;
Queue<int []> queue = new LinkedList<>();
int[] dx = {0, 1};
int[] dy = {1, 0};
boolean[][] vis = new boolean[m][n];
queue.offer(new int[]{0,0});
vis[0][0] = true;
int ans =1;
while(!queue.isEmpty()){
int[] cell = queue.poll();
int x = cell[0], y = cell[1];
for(int i = 0;i<2;i++){
int tx = x + dx[i];
int ty = y + dy[i];
if(tx < 0 || tx >= m || ty < 0 || ty >= n || get(tx) + get(ty) > k || vis[tx][ty]){
continue;
}
vis[tx][ty] = true;
queue.offer(new int[]{tx,ty});
ans++;
}
}
return ans;
}
private int get(int x){
int res = 0;
while(x != 0){
res += x % 10;
x /= 10;
}
return res;
}
}
哎,感觉每天不是在思考,而是在看答案,这样的学习能有效果吗。答案能看懂,但是每次都想不到啊。题解封装了一个求一个数的每个位上的数之和的方法,这个非常常见了,就是不停的模10取余,每次都自己除以10去掉最后一位。然后就是用dx和dy两个数组表示x和y来定义右和下两个方向,(dx[0], dy[0])是(0,1)也就是往下走一步,(dx[1], dy[1])是(1,0)也就是往右走一步,用一个等大的标记数组来记录这个位置是否走过,走过就改为true,是true就不能再走,用队列来走路线,先把(0,0)放入队列,然后用for来向下走和向右走(也就是当前的x,y加上方向数组),看看是否符合规则(下标符合数组,下标之和小于k,标记数组的此位置是false),如果不符合直接进入下一个循环,如果符合就把它放入队列,并且把标记数组的这个位置改为true,ans加1,直到队列为空,最后返回ans。