classSolution{int ans =0;boolean[][] visited;publicintmovingCount(int m,int n,int k){visited =newboolean[m][n];dfs(m, n, k,0,0);return ans;}// 行走voiddfs(int m,int n,int k,int x,int y){// 来过了就不再来咯,越界也结束咯~if(x >= m || y >= n || visited[x][y]){return;}// 可以走的话~继续往下走if(sum(x)+sum(y)<= k){ans++;visited[x][y]=true;dfs(m, n, k, x +1, y);dfs(m, n, k, x, y +1);}}// 数位和判断intsum(int x){int sum =0;while(x >0){sum += x %10;x /=10;}return sum;}}
二刷
其实 i j 是有范围限制的,否则需要像上面的代码那样写一个数位和判断。
注意:从[0, 0]出发,可能有些满足 k 条件的格子其实并不能走到
classSolution{boolean[][] graph;int counts =0;publicintmovingCount(int m,int n,int k){graph =newboolean[m][n];infect(0,0, m, n, k);return counts;}voidinfect(int i,int j,int m,int n,int k){if(i <0|| i >= m || j <0|| j >= n ||(i %10+ i /10+ j %10+ j /10)> k || graph[i][j]){return;}graph[i][j]=true;counts++;infect(i +1, j, m, n, k);infect(i, j +1, m, n, k);}}
文章目录题目描述思路 & 代码二刷题目描述
涉及二进制,位运算跑不了~
思路 & 代码
既然是32位,那么通过一次遍历,每次判断一个位是否为1即可
public class Solution {// you need to treat n as an unsigned valuepu…