标签:结束 amp 初始化 count 坐标 提示 输出 list int
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
示例 1:
输入:m = 2, n = 3, k = 1
输出:3
示例 2:
输入:m = 3, n = 1, k = 0
输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20
1 class Solution { 2 public int movingCount(int m, int n, int k) { 3 // 宽度搜索 4 int[][] visit = new int[m][n]; 5 // 初始化,第一个默认已经被访问 6 visit[0][0] = 1; 7 // 坐标数组 8 int[] x = {0, 1, 0, -1}; 9 int[] y = {1, 0, -1, 0}; 10 // 每次看一下自己周围的四个方向,能走就走,然后将该点加入队列,下次从队列中拿出该点就能够从 11 // 该点出发继续重复上述过程,一直搜索下去,直到将所有的点都试探完结束。最后visit数组中1的个数 12 // 即最终机器人能够到达的格子数 13 Deque<Point> deque = new LinkedList<>(); 14 deque.add(new Point(0, 0)); 15 while (deque.size() > 0) { 16 Point cur = deque.poll(); 17 for (int i = 0; i < 4; i++) { 18 int nextX = cur.x + x[i]; 19 int nextY = cur.y + y[i]; 20 if ((nextX >= 0 && nextX < m && nextY >= 0 && nextY < n) && getSum(nextX, nextY) <= k && visit[nextX][nextY] == 0) { 21 // 可以进入 22 visit[nextX][nextY] = 1; 23 // 加入队列 24 deque.add(new Point(nextX, nextY)); 25 } 26 } 27 } 28 29 // 统计个数 30 int res = 0; 31 for (int i = 0; i < m; i++) { 32 for (int j = 0; j < n; j++) { 33 if (visit[i][j] == 1) { 34 res++; 35 } 36 } 37 } 38 39 return res; 40 } 41 42 public int getSum(int x, int y) { 43 int res = 0; 44 while (x > 0) { 45 res += x % 10; 46 x /= 10; 47 } 48 while (y > 0) { 49 res += y % 10; 50 y /= 10; 51 } 52 53 return res; 54 } 55 } 56 57 class Point { 58 int x; 59 int y; 60 Point(int x, int y) { 61 this.x = x; 62 this.y = y; 63 } 64 }
标签:结束 amp 初始化 count 坐标 提示 输出 list int
原文地址:https://www.cnblogs.com/pengsay/p/14770063.html