劍指offer面試題13:機器人的運動範圍(java)
阿新 • • 發佈:2018-12-15
題目:地上有一個m行n列的方格。一個機器人從座標(0,0)的格子開始移動,他每次可以向上,下,左,右移動一格。但不能進入行座標和列座標的數位之和大於k的格子。例如,當K=18時,機器人能夠進入方格(35,37),因為3+5+3+7 =18,但是它不能進入方格(35,38),因為3+5+3+8 = 19請問機器人能夠到達多少個格子?
直接擼上程式碼:
public class Solution { public int movingCount(int number, int rows, int cols) { if(number<=0||rows<=0||cols<=0) return 0; boolean[] flag = new boolean[rows*cols]; return movingCountCore(number,rows,cols,0,0,flag); } int movingCountCore(int number,int rows,int cols,int row,int col,boolean[] flag){ if(row<0||row>=rows||col<0||col>=cols) return 0; if(flag[row*cols+col]||!checkNumber(number,row,col)) //該位置被訪問過,並且不符合要求(行列位數之和小於number18) return 0; flag[row*cols+col] = true; //當前格子用當前行數*總列數+當前列數表示 return 1+movingCountCore(number,rows,cols,row-1,col,flag) +movingCountCore(number,rows,cols,row+1,col,flag) +movingCountCore(number,rows,cols,row,col-1,flag) +movingCountCore(number,rows,cols,row,col+1,flag); } boolean checkNumber(int number,int row,int col){ int sum = 0; while(row>0){ sum += row%10; row /= 10; } while(col>0){ sum += col%10; col /=10; } return sum<=number; } }
分析:機器人的座標從(0,0)開始,我們建立一個boolean[] flag 來標誌該格子是否被訪問過。
1)先對資料進行判斷是否出錯;
2)我們傳入引數,同時為方便遞迴,我們傳遞引數時傳入當前行和列來尋找指定格子
3)每一次符合要求後,我們設定該格子的標誌位位true,並遞迴該格子的上,下,左,右。直到找出所有的格子。