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表示走过。

  第二步:函数sum (int row, int col)用来计算第i位,第j位的数位之和。

  第三步:检查能否进入坐标为(row, col)的方格

  第四步:getSum(row,col) <= threshold && !visited[row*cols+col]表示可以走。

  第五步:满足第四步的判断,将此格子在flag中标记为true,标记走过了。

  第六步:递归这个位置的上、下、左、右,返回递归的上、下、左、右再加1(加上自己)的和。

  第七步:在movingCount函数中调用movingCountCore函数,初始的位置即i=0,j=0,让其递归出的结果直接返回。

3 C++核心代码    

 class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
if(threshold <= || rows < || cols<)
return ; bool *visited = new bool[rows * cols];
memset(visited,,rows * cols); int count = movingCountCore(threshold,rows,cols,,,visited); delete[] visited; return count;
} int movingCountCore(int threshold,int rows, int cols, int row, int col, bool* visited)
{
int count = ;
// 检查能否进入坐标为(row, col)的方格
if(row>= && row < rows && col>= && col<cols && getSum(row,col) <= threshold && !visited[row*cols+col])
{
visited[row*cols + col] = true;
count = + movingCountCore(threshold,rows,cols,row-,col,visited)
+ movingCountCore(threshold,rows,cols,row+,col,visited)
+ movingCountCore(threshold,rows,cols,row,col-,visited)
+ movingCountCore(threshold,rows,cols,row,col+,visited);
}
return count;
} // 得到数位和
int getSum(int row, int col)
{
int sum = ;
while(row>){
sum += row%;
row /= ;
}
while(col>){
sum += col%;
col /= ;
}
return sum;
}
};

参考资料

https://blog.csdn.net/zjwreal/article/details/89296096https://blog.csdn.net/u012477435/article/details/83351659#_1782

https://blog.csdn.net/qq_43109561/article/details/89670163

https://blog.csdn.net/Mr_XiaoZ/article/details/81174055?utm_source=blogxgwz1

剑指offer66:机器人的运动范围的更多相关文章

  1. 剑指offer66:机器人的活动范围

    地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格 ...

  2. 剑指Offer——机器人的运动范围

    题目描述: 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人 ...

  3. 剑指offer--48.机器人的运动范围

    这道题不是要求走一趟最多走多少,而是最多走多少,WA几次才想通. ------------------------------------------------------------------- ...

  4. 剑指Offer66题的总结、目录

    原文链接 剑指Offer每日6题系列终于在今天全部完成了,从2017年12月27日到2018年2月27日,历时两个月的写作,其中绝大部分的时间不是花在做题上,而是花在写作上,这个系列不适合大神,大牛, ...

  5. 机器人的运动范围 剑指offer66题

    include "stdafx.h" #include<vector> #include<algorithm> #include<string> ...

  6. 剑指offer——2

    剑指offer 机器人的运动范围 数组的应用和递归 package com.wang.test; public class Myso { /** * 题目描述 * 地上有一个m行和n列的方格.一个机器 ...

  7. 【Java】 剑指offer(12) 机器人的运动范围

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移 ...

  8. 剑指 Offer 13. 机器人的运动范围 + 深搜 + 递归

    剑指 Offer 13. 机器人的运动范围 题目链接 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/ ...

  9. 剑指 Offer 13. 机器人的运动范围

    剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...

随机推荐

  1. Redis哨兵日志说明

    一.说明

  2. sql 数字转换为字符串补0

    select right('00000000000'+convert(varchar(5),123),5) select right('00000000000'+cast(123   as   var ...

  3. Vue学习手记09-mock与axios拦截的使用

    01.安装 安装mock npm install mockjs 安装axios npm install axios 02.新建一个config.js文件做axios拦截 import axios fr ...

  4. PostgreSQL学习笔记(九) 用户、角色、权限管理

    PostgreSQL是一个多用户数据库,可以为不同用户指定允许的权限. 角色PostgreSQL使用角色的概念管理数据库访问权限. 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数 ...

  5. 【Java.Regex】用正则表达式查找Java文件里的字符串

    代码: import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; imp ...

  6. 【转】自动化框架中引入ExtentReport美化报告

    本文链接:https://blog.csdn.net/qq_30353203/article/details/82023922一.先引入三个依赖包 <dependency> <gro ...

  7. Dart 自增++自减--和循环语句

    void main(){ /* ++ -- 表示自增 自减 1 在赋值运算里面 如果++ -- 写在前面 这时候先运算 再赋值,如果++ --写在后面 先赋值后运行运算 var a=10; var b ...

  8. 【插件式框架探索系列】应用程序域(AppDomain)

    应用程序域(AppDomain)已经不是一个新名词了,只要熟悉.net的都知道它的存在,不过我们还是先一起来重新认识下应用程序域吧,究竟它是何方神圣. 应用程序域 众所周知,进程是代码执行和资源分配的 ...

  9. Fiddler抓包显示请求时延

    两种方式:配置和加代码.配置只是将隐藏的时延字段显现了出来,格式没法改:加代码就随你写了,格式自己说了算. 先说配置的,在左边框顶部字段名称右击鼠标 -> 点击Customize colums. ...

  10. netty5拆包问题解决实例

    基于之前的例子(参见netty5自定义私有协议实例),我们修改下客户端handler,让发送的数据超过1024字节: NettyClientHandler: /** * 构造PCM请求消息体 * * ...