《剑指offer》第13题 机器人的运动范围
机器人的运动范围
http://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8
Try two methods. One is BFS with the queue. The other is DFS with recursion.
import java.util.*; public class Solution { // bfs with queue public final int[][] direction = {{-1,0},{0,1},{1,0},{0,-1}}; public int movingCount(int threshold, int rows, int cols) { Queue<Cell> queue = new LinkedList<>(); int[][] mark = new int[rows][cols]; int count = 0; queue.offer(new Cell(0,0)); while(!queue.isEmpty()) { Cell cell = queue.poll(); int x = cell.x; int y = cell.y; if(x >= 0 && y >= 0 && x < rows && y < cols && mark[x][y] == 0) { mark[x][y] = 1; if(cell.CheckCell(threshold)) { count++; for(int i = 0 ; i < direction.length;i++) { int newX = x + direction[i][0]; int newY = y + direction[i][1]; queue.offer(new Cell(newX,newY)); } } } } return count; } private class Cell { int x,y; public Cell(int x,int y) { this.x = x; this.y = y; } private boolean CheckCell(int threhold) { if(getSum(this.x) + getSum(this.y) > threhold) { return false; } return true; } private int getSum(int n) { int sum = 0; while(n != 0) { sum += n % 10; n = n / 10; } return sum; } } } import java.util.*; public class Solution { // dfs with recursion int count; public final int[][] direction = {{-1,0},{0,1},{1,0},{0,-1}}; public Solution() { this.count = 0; } public int movingCount(int threshold, int rows, int cols) { int[][] mark = new int[rows][cols]; dfs(rows,cols,threshold,new Cell(0,0),mark); return count; } private void dfs(int rows,int cols,int threshold,Cell cell,int[][] mark) { int x = cell.x, y = cell.y; if(x < 0 || y < 0 || x >= rows || y >= cols || mark[x][y] == 1) { return; } mark[x][y] = 1; if(!cell.CheckCell(threshold)) { return; } count++; for(int i = 0; i < direction.length;i++) { int newX = x + direction[i][0]; int newY = y + direction[i][1]; dfs(rows,cols,threshold,new Cell(newX,newY),mark); } } private class Cell { int x,y; public Cell(int x,int y) { this.x = x; this.y = y; } private boolean CheckCell(int threhold) { if(getSum(this.x) + getSum(this.y) > threhold) { return false; } return true; } private int getSum(int n) { int sum = 0; while(n != 0) { sum += n % 10; n = n / 10; } return sum; } } }