算法题之机器人运动范围问题
问题描述
思路分析
思路1:使用递归回溯法进行求解
代码实现
int moveCount;
public int movingCount ( int m, int n, int k) {
int [ ] [ ] board = new int [ m] [ n] ;
findMovingPath ( 0 , 0 , m, n, board, k) ;
return moveCount;
}
private Boolean findMovingPath ( int row, int col, int m, int n, int [ ] [ ] board, int k) {
if ( row < 0 || row >= m || col < 0 || col >= n || getSum ( row, col) > k || board[ row] [ col] == 1 ) {
return false ;
}
moveCount++ ;
board[ row] [ col] = 1 ;
boolean isVisited = findMovingPath ( row, col - 1 , m, n, board, k) || findMovingPath ( row, col + 1 , m, n, board, k)
|| findMovingPath ( row - 1 , col, m, n, board, k) || findMovingPath ( row + 1 , col, m, n, board, k) ;
return isVisited;
}
private int getSum ( int row, int col) {
int sum = 0 ;
sum = sum + row % 10 + ( row / 10 ) % 10 + ( row / 100 ) % 10 + col % 10 + ( col / 10 ) % 10 + ( col / 100 ) % 10 ;
return sum;
}
方法2:使用DFS深度优先搜索
代码实现
int m, n, k;
boolean [ ] [ ] visited;
public int movingCount ( int m, int n, int k) {
this . m = m; this . n = n; this . k = k;
this . visited = new boolean [ m] [ n] ;
return dfs ( 0 , 0 , 0 , 0 ) ;
}
public int dfs ( int i, int j, int si, int sj) {
if ( i >= m || j >= n || k < si + sj || visited[ i] [ j] ) {
return 0 ;
}
visited[ i] [ j] = true ;
return 1 + dfs ( i + 1 , j, ( i + 1 ) % 10 != 0 ? si + 1 : si - 8 , sj)
+ dfs ( i, j + 1 , si, ( j + 1 ) % 10 != 0 ? sj + 1 : sj - 8 ) ;
}