1. 程式人生 > >劍指offer面試題13:機器人的運動範圍(java)

劍指offer面試題13:機器人的運動範圍(java)

題目:地上有一個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,並遞迴該格子的上,下,左,右。直到找出所有的格子。