深度优先DFS:
class Solution {
private int cnt = 0;
public int byteSum (int i, int j) {
int sum = 0;
while (i != 0) {
sum += i %10;
i /= 10;
}
while (j != 0) {
sum += j % 10;
j /= 10;
}
return sum;
}
public void dfs(int i, int j, int m, int n, int k, int[][] board) {
if (i < 0 || i >= m || j < 0 || j >= n || byteSum(i, j) > k || board[i][j] == 1) {
return;
}
board[i][j] = 1;
cnt++;
dfs(i - 1, j, m, n, k, board);
dfs(i + 1, j, m, n, k, board);
dfs(i, j - 1, m, n, k, board);
dfs(i, j + 1, m, n, k, board);
}
public int movingCount(int m, int n, int k) {
int[][] board = new int[m][n];
dfs(0, 0, m, n, k, board);
return cnt;
}
}
广度优先BFS:
class Solution {
public int byteSum (int i, int j) {
int sum = 0;
while (i != 0) {
sum += i %10;
i /= 10;
}
while (j != 0) {
sum += j % 10;
j /= 10;
}
return sum;
}
public int movingCount(int m, int n, int k) {
int[][] board = new int[m][n];
Queue<int[]> queue = new LinkedList<int[]>();
queue.offer(new int[]{0, 0});
board[0][0] = 1;
int cnt = 0;
while (!queue.isEmpty()) {
cnt++;
int[] temp = queue.poll();
int i = temp[0], j = temp[1];
if ((j + 1) < n && board[i][j + 1] == 0 && byteSum(i, j + 1) <= k) {
queue.offer(new int[]{i, j + 1});
board[i][j + 1] = 1;
}
if ((i + 1) < m && board[i + 1][j] == 0 && byteSum(i + 1, j) <= k) {
queue.offer(new int[]{i + 1, j});
board[i + 1][j] = 1;
}
}
return cnt;
}
}