剑指offer

机器人的运动范围

数组的应用和递归

package com.wang.test;

public class Myso {

    /**
* 题目描述
* 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
* 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
* @param threshold 限制条件
* @param rows 数组的总行数
* @param cols 数组的总列数
* @return 能达到的格子数
*/ public static int movingCount(int threshold, int rows, int cols){
//定义一个二维数组,标记已经访问的位置
//1 表示已经访问了
int[][] mark = new int[rows][cols]; //调用移动函数,进行计算和计数,然后返回最终值
int count = move(threshold,rows,cols,0,0,mark); return count;
} /**
*
* @param threshold 限制条件
* @param rows 数组的总行数
* @param cols 数组的总列数
* @param strr 开始位置的行号 start_row
* @param strc 开始位置的列号 start_col
* @param mark 标记数组
* @return 返回格子数
*/
public static int move(int threshold, int rows, int cols,int strr,int strc,int[][] mark) { /*
判断条件:
strr<0:初始行号不能小于0
strc<0:初始列号不能小于0
strr>=rows :初始行号不能大于等于整个数组的行号
strc>=cols :初始列号不能大于等于这个数组的列号
mark[strr][strc] == 1 初始值为1就表示已经访问了,走到最后了,该退出函数了
!limit(threshold,strr,strc) :判断是否符合条件
这个判断相当于出口
*/
if(strr<0||strc<0||strr>=rows ||strc>=cols ||mark[strr][strc] == 1 || !limit(threshold,strr,strc)){
return 0;
} //标记初始值为1,假定的
mark[strr][strc] = 1; //进行递归,开始是0,0;不需要上/左
return 1+move(threshold,rows,cols,strr+1,strc,mark)+move(threshold,rows,cols,strr,strc+1,mark);
// move(threshold,rows,cols,strr-1,strc,mark)+
// move(threshold,rows,cols,strr,strc-1,mark); } /**
* 进行判断是否符合条件
* @param threshold 限制条件
* @param strr 当前位置行
* @param strc 当前位置列
* @return 返回值为true 代表不可访问,false代表可以访问
*/
public static boolean limit(int threshold, int strr, int strc) { boolean limit = true;
//行的位数和
int sum_row = 0;
//列的位数和
int sum_col = 0; //求行的位数和
while(strr>0){
sum_row += strr%10;//取出末位进行相加
strr /= 10;//将数进行右移
}
// 求列位数的和
while(strc>0){
sum_col += strc%10;
strc /= 10;
} //进行判断,行的位数和+列的位数 与 限制条件进行对比
// > 没有限制
// < 有限制
if(sum_col+sum_row > threshold){
limit =false;
}
//返回判断结果
return limit;
} //调用进行测试
public static void main(String[] args) {
int i = movingCount(10,7,7);
System.out.println(i);
} }

最新文章

  1. java 获取中文字符的首字母
  2. 【状压DP】bzoj1087 互不侵犯king
  3. js阻止冒泡及jquery阻止事件冒泡示例介绍
  4. osg设置相机参数,包括初始位置
  5. nginx json 格式输出
  6. tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
  7. Orcle 系统表
  8. 【面试题015】链表中倒数第k个结点
  9. 深入了解line-height
  10. su认证失败??? su root 输入命令后显示 &quot;su:Authentication failure&quot;
  11. HttpRuntime类
  12. Load and Unload
  13. Java OCR tesseract 图像智能字符识别技术 Java代码实现
  14. 比较两个date返回日期相差天数
  15. idea自我使用简单使用方式和出现的一些简单问题以及常用快捷键
  16. 基本命令行操作1(java编译)
  17. Python报错:SyntaxError: Non-ASCII character '\xe5' in file 1.py on line 6, but no encoding declared...
  18. 开辟sys节点用户层直接操作物理地址(比/dev/mem方便)
  19. 【vue】移动端demo资料
  20. TeamViewer 12\13\14 破解版(解决检测为商业用途的方式)

热门文章

  1. Windows Server系统部署MySQL数据库
  2. Pycharm永久激活2且jetbrains全系列产品
  3. Java Web学习(六)HttpServletRequest(客户端请求)
  4. Spring的三大核心接口——BeanFactory、ApplicationContext、WebApplicationContext
  5. .net core中的那些常用的日志框架(Logging篇)
  6. 实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值
  7. JAVA并发笔记
  8. Spark Parquet详解
  9. 使用模拟退火算法优化 Hash 函数
  10. 头文件afx.h作用