面试题67 机器人的运动范围
2016-04-10 22:11
627 查看
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?class Solution { public: int sum(int row, int col){ int num = 0; while (row){ num += row % 10; row /= 10; } while (col){ num += col % 10; col /= 10; } return num; } void m(int threshold, int rows, int cols, int i, int j, int &count, int isWalked[]){ if (i - 1 >= 0 && isWalked[(i - 1) * cols + j] == 0 && sum(i - 1, j) <= threshold){ isWalked[(i - 1) * cols + j] = 1; count++; m(threshold, rows, cols, i - 1, j, count, isWalked); } if (i + 1 < rows && isWalked[(i + 1) * cols + j] == 0 && sum(i + 1, j) <= threshold){ isWalked[(i + 1) * cols + j] = 1; count++; m(threshold, rows, cols, i + 1, j, count, isWalked); } if (j - 1 >= 0 && isWalked[i * cols + j - 1] == 0 && sum(i, j - 1) <= threshold){ isWalked[i * cols + j - 1] = 1; count++; m(threshold, rows, cols, i, j - 1, count, isWalked); } if (j + 1 < cols && isWalked[i * cols + j + 1] == 0 && sum(i, j + 1) <= threshold){ isWalked[i * cols + j + 1] = 1; count++; m(threshold, rows, cols, i, j + 1, count, isWalked); } } int movingCount(int threshold, int rows, int cols) { if (threshold < 0) return 0; int i = 0, j = 0, count = 1; int *isWalked = new int[rows * cols]; isWalked[0] = 1; for (int i = 1; i < rows * cols; i++) isWalked[i] = 0; m(threshold, rows, cols, i, j, count, isWalked); return count; } };
相关文章推荐
- 面试题66 矩阵中的路径
- 面试题65 滑动窗口的最大值
- 程序员眼里的高迸发
- 面试题64 数据流中的中位数
- 面试题63 二叉搜索树的第k个结点
- 前端面试题整理——CSS篇
- 面试题62 序列化二叉树
- 面试题61 把二叉树打印成多行
- 面试题60 按之字形顺序打印二叉树
- JAVA多线程和并发基础面试问答
- 【转】程序员技术练级攻略
- LeetCode(39)-Intersection of Two Linked Lists
- 面试题59 对称的二叉树
- 一位Google程序员的算法学习之路
- Android面试常问的技术问题
- 面试题58 二叉树的下一个结点
- SSH框架整合配置所需JAR包(SSH整合)
- 面试题57 删除链表中重复的结点
- Activity生命周期(面试必问)
- error 和 exception的区别