剑指offer66:机器人的运动范围
1 题目描述
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/89296096,https://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:机器人的运动范围的更多相关文章
- 剑指offer66:机器人的活动范围
地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格 ...
- 剑指Offer——机器人的运动范围
题目描述: 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人 ...
- 剑指offer--48.机器人的运动范围
这道题不是要求走一趟最多走多少,而是最多走多少,WA几次才想通. ------------------------------------------------------------------- ...
- 剑指Offer66题的总结、目录
原文链接 剑指Offer每日6题系列终于在今天全部完成了,从2017年12月27日到2018年2月27日,历时两个月的写作,其中绝大部分的时间不是花在做题上,而是花在写作上,这个系列不适合大神,大牛, ...
- 机器人的运动范围 剑指offer66题
include "stdafx.h" #include<vector> #include<algorithm> #include<string> ...
- 剑指offer——2
剑指offer 机器人的运动范围 数组的应用和递归 package com.wang.test; public class Myso { /** * 题目描述 * 地上有一个m行和n列的方格.一个机器 ...
- 【Java】 剑指offer(12) 机器人的运动范围
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移 ...
- 剑指 Offer 13. 机器人的运动范围 + 深搜 + 递归
剑指 Offer 13. 机器人的运动范围 题目链接 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/ ...
- 剑指 Offer 13. 机器人的运动范围
剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...
随机推荐
- 用vue做todolist
<template> <div class="hello"> <div style="height:25px;line-height:25p ...
- radio得值
$('input[name="ylqxjylcldnbModel.jylb"]:checked').val(); <input type="radio" ...
- Java 面向对象(十五)
Lambda表达式 1. 函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是"拿什么东西做什么事情".相对而言,面向对象过分强调"必须通过对象的 ...
- 【转】iPhone手机获取uuid 安装测试app
iPhone手机获取uuid 安装测试app UDID是一种iOS设备的特殊识别码.除序号之外,每台ios装置都另有一组独一无二的号码,我们就称之为识别码( Unique Device Identif ...
- Qt 中的对象模型(Object Model)
原标题:Qt 中的对象模型(Object Model)90不太后,余生皆折腾 本节内容主要讲了 Qt 对象模型比标准 C++ 对象模型多了什么内容,并介绍了组成 Qt 对象模型基础的相关的类.最后说明 ...
- 经管/管理/团队经典电子书pdf下载
卓有有效的管理者 管理的本质 只有偏执狂才能生存 格鲁夫给经理人的第一课 影响力: 你为什么会说“是” 关键影响力:如何调动团队力量 执行 如何完成任务的学问
- Xcode: Xcode中Command Line Tools的安装方法
1. 打开终端: 2. 输入命令: xcode-select --install ,如果出现下图,说明你已经安装过了,下边内容也不用看了 如果出现下图说明还没有安装,点击安装 同意协议: 稍等片刻.. ...
- 钉钉通知机器人与SpringBoot的集成
Spring Boot Admin 集成自定义监控告警(2.0.1版本)------钉钉机器人 - yuancao24的博客 - CSDN博客https://blog.csdn.net/yuancao ...
- ffmpeg编译错误,提示找不到相应的shared libraries :libavdevice.so.53
解决方法:需要配置响应的环境变量,以便能找到响应的lib库 vi /etc/ld.so.conf 加入 /usr/local/lib 执行 sudo ldconfig
- shell按月循环取数
这里有个需求,按月查询,并且要输出每月的开始日期,结束日期. shell脚本如下: #!/bin/sh echo "0个参数时, 按月执行,默认当前月份 " echo " ...