码迷,mamicode.com
首页 > 其他好文 > 详细

剑指 Offer 13. 机器人的运动范围——宽度优先搜索

时间:2021-05-24 09:50:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:结束   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

 

分析

每次看一下自己周围的四个方向,能走就走,然后将该点加入队列,下次从队列中拿出该点就能够从该点出发继续重复上述过程,一直搜索下去,直到将所有的点都试探完结束。最后visit数组中1的个数即最终机器人能够到达的格子数

 

AC代码

 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 }

 

剑指 Offer 13. 机器人的运动范围——宽度优先搜索

标签:结束   amp   初始化   count   坐标   提示   输出   list   int   

原文地址:https://www.cnblogs.com/pengsay/p/14770063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!