算法题之机器人运动范围问题
问题描述
思路分析
思路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);
}
转载请注明原文地址:https://blackberry.8miu.com/read-13807.html