面试题67 机器人的运动范围
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
1 class Solution { 2 public: 3 int sum(int row, int col){ 4 int num = 0; 5 while (row){ 6 num += row % 10; 7 row /= 10; 8 } 9 while (col){ 10 num += col % 10; 11 col /= 10; 12 } 13 return num; 14 } 15 void m(int threshold, int rows, int cols, int i, int j, int &count, int isWalked[]){ 16 if (i - 1 >= 0 && isWalked[(i - 1) * cols + j] == 0 && sum(i - 1, j) <= threshold){ 17 isWalked[(i - 1) * cols + j] = 1; 18 count++; 19 m(threshold, rows, cols, i - 1, j, count, isWalked); 20 } 21 if (i + 1 < rows && isWalked[(i + 1) * cols + j] == 0 && sum(i + 1, j) <= threshold){ 22 isWalked[(i + 1) * cols + j] = 1; 23 count++; 24 m(threshold, rows, cols, i + 1, j, count, isWalked); 25 } 26 if (j - 1 >= 0 && isWalked[i * cols + j - 1] == 0 && sum(i, j - 1) <= threshold){ 27 isWalked[i * cols + j - 1] = 1; 28 count++; 29 m(threshold, rows, cols, i, j - 1, count, isWalked); 30 } 31 if (j + 1 < cols && isWalked[i * cols + j + 1] == 0 && sum(i, j + 1) <= threshold){ 32 isWalked[i * cols + j + 1] = 1; 33 count++; 34 m(threshold, rows, cols, i, j + 1, count, isWalked); 35 } 36 } 37 int movingCount(int threshold, int rows, int cols) 38 { 39 if (threshold < 0) 40 return 0; 41 int i = 0, j = 0, count = 1; 42 int *isWalked = new int[rows * cols]; 43 isWalked[0] = 1; 44 for (int i = 1; i < rows * cols; i++) 45 isWalked[i] = 0; 46 m(threshold, rows, cols, i, j, count, isWalked); 47 return count; 48 } 49 };