剑指offer13机器人运动的范围
Posted shiganquan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer13机器人运动的范围相关的知识,希望对你有一定的参考价值。
题目
地上有一个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 movingCount(int threshold, int rows, int cols) { if (threshold < 0 || rows < 0 || cols < 0) return false; bool* visited = new bool[rows * cols]; memset(visited, 0, rows * cols); int row = 0, col = 0; int count = movingCountCore(threshold, rows, cols, row, col, visited); delete[] visited; return count; } int movingCountCore(int threshold, int rows, int cols, int row, int col, bool* visited){ int count1 = 0; if (check(threshold, rows, cols, row, col, visited)){ visited[row * cols + col] = true; count1 = 1 + movingCountCore(threshold, rows, cols, row - 1, col, visited) + movingCountCore(threshold, rows, cols, row, col - 1, visited) + movingCountCore(threshold, rows, cols, row + 1, col, visited) + movingCountCore(threshold, rows, cols, row, col + 1, visited); } return count1; } bool check(int threshold, int rows, int cols, int row, int col, bool* visited){ if (row >= 0 && col >=0 && row < rows && col < cols && !visited[row * cols + col] && getNumber(threshold, row, col)) return true; return false; } bool getNumber(int threshold, int row, int col){ int sum = 0; while (row > 0 || col > 0){ sum = sum + row % 10 + col % 10; row /= 10; col /= 10; } if (sum <= threshold) return true; return false; } };
以上是关于剑指offer13机器人运动的范围的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode(剑指 Offer)- 13. 机器人的运动范围
剑指 Offer(C++版本)系列:剑指 Offer 13 机器人的运动范围