剑指 Offer 13 - 机器人的运动范围
1 题目
https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
2 题意
地上有一个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
3 思路
author's blog == http://www.cnblogs.com/toulanboy/
出发点:本题需要知道机器人从起点出发,能到达的格子数,可以用搜索算法解决。
具体搜索思路:机器人每次的移动方向都是上下左右四个方向,我们只需判断是否能走到这4个方向的格子,如果能,则进一步循环(或递归)这个过程。
实现方式:深度优先搜索或广度优先搜索皆可。本题采用广度优先搜索,相对的优点是没有递归过程,理论上能减少时间。
4 代码
//author's blog == http://www.cnblogs.com/toulanboy/
class Solution {
public:
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bool visit[110][110];
bool judge(int x, int y, int m, int n, int k){
if(x >= 0 && x < m && y >=0 && y < n && visit[x][y] == false){
//拆分行坐标、列坐标
int sum = 0;
while(x){
sum += x%10;
x /= 10;
}
while(y){
sum += y%10;
y /= 10;
}
if(sum > k){
return false;
}
else{
return true;
}
}
return false;
}
int movingCount(int m, int n, int k) {
int ans = 0;
memset(visit, 0, sizeof(visit));
queue<pair<int, int> >q;
q.push(make_pair(0, 0));//将起点进队
visit[0][0] = true;
ans++;//起点也能到达,ans++。
while(!q.empty()){//开始逐层扩散
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i=0; i<4; ++i){//四个方向
int new_x = x + dir[i][0];
int new_y = y + dir[i][1];
if(judge(new_x, new_y, m, n, k)){//合法性判断、能否到达判断
ans++;
q.push(make_pair(new_x, new_y));
visit[new_x][new_y] = true;
}
}
}
return ans;
}
};
❤ 如果这篇文章对你有帮助,麻烦来个大拇指👍,谢谢。