[剑指Offer] 66.机器人的运动范围

题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

【思路】DFS

 1 class Solution {
 2 public:
 3     int flag[1000][1000];
 4     int sum(int x,int y){
 5         int sum = 0;
 6         while(x > 0){
 7             sum += x % 10;
 8             x /= 10;
 9         }
10         while(y > 0){
11             sum += y % 10;
12             y /= 10;
13         }
14         return sum;
15     }
16     int dfs(int threshold, int rows, int cols, int i, int j){
17         int count = 0;
18         if(i >= 0 && i < rows && j >= 0 && j < cols && sum(i,j) <= threshold && flag[i][j] == 0){
19             flag[i][j] = 1;
20             count += dfs(threshold, rows, cols, i - 1, j)
21                      + dfs(threshold, rows, cols, i + 1, j)
22                      + dfs(threshold, rows, cols, i, j - 1)
23                      + dfs(threshold, rows, cols, i, j + 1)
24                      + 1;
25         }
26         return count;
27     }
28     int movingCount(int threshold, int rows, int cols)
29     {
30         memset(flag,0,sizeof(flag));
31         return dfs(threshold, rows, cols, 0, 0);
32     }
33 };
时间: 2024-10-16 23:27:20

[剑指Offer] 66.机器人的运动范围的相关文章

剑指offer:机器人的运动范围

题目描述地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? class Solution: def movingCount(self, threshold, rows, cols): # 判断(row, c

剑指offer66:机器人的运动范围

1 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 2 思路和方法 第一步:创建一个行为rows,列为cols的bool型数组,用来标记走过的位置,初始化为false,true表示走过. 第二

剑指offer 66题 -- 连续子数组的最大和

class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { int maxNum =0x80000000; int curNum = 0; for(int i=0; i<array.size(); i++) { if(curNum <= 0) curNum = array[i]; else curNum += array[i]; if(curNum > maxNum) maxNum =

剑指offer 66题 -- 将一个字符串中的空格替换成“%20”

class Solution {public: void replaceSpace(char *str,int length) { //变量定义区 int newtv = 0; int oldtv = 0; int spaceNum = 0; //入参有效性判断 if( NULL == str || length <= 0) return; //计算空格数目 int i =0; while(str[i] != '\0') { oldtv++; if(str[i] == ' ') spaceNum

剑指offer 66题 -- 字符串的排列

class Solution {public: vector<string> Permutation(string str) { vector<string> result; if(str.size()<=0) return result; int start = 0; permute( str, start, result); sort( result.begin(), result.end() ); return result; } //采用传引用的方式,处理递归过程中的

剑指offer 66题 -- 丑数

class Solution {public: int GetUglyNumber_Solution(int index) { //变量定义区 int subA=0, subB=0, subC=0; int sub =0; int* array = new int[index]; array[0] = 1; if(index <= 0) return 0; //分析:数组的后面的每一个元素必定是由数组前面的某一个乘以2,3,或者5得到 //  也就是说, 每个当前的值,都是由前面的某个值的2倍,

剑指Offer 66

1 # -*- coding:utf-8 -*- 2 class Solution: 3 def multiply(self, A): 4 n = len(A) 5 mat = [[1 for _ in range(n)]for _ in range(n)] 6 for i in range(n): 7 for j in range(n): 8 if i != j: 9 mat[i][j] = A[j] 10 B = [1] * n 11 for i in range(n): 12 mul =

剑指 offer 第一题: 二维数组中的查找

打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣 ?? 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 图 1 如果没有头绪的话,很显然使用 暴力解法 是完全可以解决该问题的. 即遍历二维数组中的每一个元素,时间复杂度:O(n^2). 其实到这里我们就可以发现,使用这种暴力解法并没有充分利用题目给出的信息.这

《剑指offer》全部题目-含Java实现

陆续刷了好久,算是刷完了<剑指offer>,以下全部AC代码,不一定性能最优,如有错误或更好解答,请留言区指出,大家共同交流,谢谢~ 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class Solution { public boolean Find(int target, int [][] array) { if(array == n