classSolution{publicintmovingCount(int m,int n,int k){if(k ==0)return1;//标记当前格子是否访问过,访问过为1int[][] vis =newint[m][n];//{dx, dy}组成了周边格子相对于当前格子的行列坐标偏移量int[] dx ={0,1};int[] dy ={1,0};//记录可访问的格子总数int ans =1;//用队列存储当前元素的周边元素Queue<int[]> queue =newLinkedList<>();//首先将{0, 0}开始
queue.offer(newint[]{0,0});while(!queue.isEmpty()){//cell存储的是当前格子的行,列坐标int[] cell = queue.poll();//分别访问当前格子的周边格子,这里只循环到2是根据规律,只有向右和下搜索才是有效的for(int i =0; i <2; i++){int x = cell[0]+ dx[i];int y = cell[1]+ dy[i];//如果该格子不和要求,则跳过该格子//如果行列坐标超过m, n或者已经访问过或者位数之和大于kif(x <0|| x >= m || y <0|| y >= n || vis[x][y]==1||get(x)+get(y)> k)continue;//如果和要求,则入队,并且标记vis和总数加1
queue.offer(newint[]{x, y});
vis[x][y]=1;
ans++;}}return ans;}publicintget(int x){int count =0;while(x !=0){
count += x %10;
x /=10;}return count;}}
1.思路:使用广度优先遍历,使用队列存储元素,将当前元素出队,依次访问该元素的周边元素,如果符合条件则记作以访问,并将其入队,总数加1,从而实现广度优先。当队列为空时,则结束访问,返回总数。2.代码:class Solution { public int movingCount(int m, int n, int k) { if(k == 0)return 1; //标记当前格子是否访问过,访问过为1 int[][] vis = new int[m]