标签:大于 false 剑指offer int ntc visit ems site amp
地上有一个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; } };
标签:大于 false 剑指offer int ntc visit ems site amp
原文地址:https://www.cnblogs.com/shiganquan/p/9289736.html