中等難度的高級測試開發(fā)崗算法題:機器人的運動范圍
題目信息:
地上有一個m行n列的坐標方格,從坐標 [0,0] 到坐標 [m-1,n-1] 。一個機器人從坐標 [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標和列坐標的數(shù)位之和大于k的格子。例如,當k為18時,機器人能夠進入坐標方格 [35, 37] ,因為3+5+3+7=18 <= k。但它不能進入方格 [35, 38],因為3+5+3+8=19 > k。請問該機器人能夠到達多少個格子?
示例 1:
輸入:m = 2, n = 3, k = 1
輸出:3
示例 2:?
輸入:m = 3, n = 1, k = 0?
輸出:1
提示:1 <= n,m <= 100; 0 <= k <= 20
解題思路:
這是一道中等難度的算法題,可能出現(xiàn)在高級測試開發(fā)等面試場景中。這題是對空間搜索和動態(tài)規(guī)劃等算法點的考察,了解這個出題點后,我們就可以針對性的編碼實現(xiàn)了。
1、我們根據(jù)坐標的行列(m, n)值,畫出一張mxn的矩陣,也就是一個[m][n]的二維數(shù)組,數(shù)組的下標即是坐標;2、對數(shù)組進行遍歷,并判斷當前坐標(x,y)是否滿足:x和y的數(shù)位之和小于等于k;

如何計算位數(shù)之和?這里需要用到求余和除法,由于提示中告知k小于等于100,那么我們計算x坐標的位數(shù)和就只需要 (x/10) + (x%10),但對于k=100的情況需要單獨處理,k=100時,位數(shù)和=1。
3、對于符合條件的坐標,我們需要繼續(xù)往上下左右四個方向進行搜索,指導遇到下面情況就退出搜索:
?超出邊界?不符合位數(shù)和的條件?已經(jīng)搜索過了,數(shù)組值為1
4、為了記錄搜索的結(jié)果,我們可以將 [m][n]的二維數(shù)組設(shè)置成true和false或者0和1的值,符合條件就將數(shù)組值設(shè)置為1;5、最后我們再遍歷一次數(shù)組,統(tǒng)計數(shù)組值為1的數(shù)量即得出最終的結(jié)果。
代碼實現(xiàn):
class Solution {public int movingCount(int m, int n, int k) {if (m < 1 || n < 1) {return 0;}if (k == 0) {return 1;}int counter = 0;int[][] arr = new int[m][n];for (int i = 0; i < m; i ++) {for (int j = 0; j < n; j++) {arr[i][j] = 0;}}????????dfs(arr,?k,?0,?0);//從(0,0)開始搜索for (int i = 0; i < m; i ++) {for (int j = 0; j < n; j++) {if (arr[i][j] == 1) {counter++;}}}return counter;}private void dfs(int[][] arr, int k, int x, int y){int m = arr.length;int n = arr[0].length;if (x<0 || x>m-1 || y<0 || y >n-1 || arr[x][y] == 1) {return;}if (calc(x,y) <= k) {arr[x][y] = 1;dfs(arr,k, x+1,y);dfs(arr,k, x-1,y);dfs(arr,k, x,y-1);dfs(arr,k, x,y+1);}}private int calc(int i, int j) {int sum = 0;if (i == 100) {sum += 1;} else if (i >= 10) {sum += (i/10) + (i%10);} else {sum += i;}if (j == 100) {sum += 1;} else if (j >= 10) {sum += (j/10) + (j%10);} else {sum += j;}return sum;}}
