剑指offer-机器人的运动范围
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
题目链接:
一:
DFS深度优先遍历。
public class Solution { public int movingCount(int threshold, int rows, int cols) { boolean[][] flag = new boolean[rows][cols]; return DFS(threshold,rows,cols,0,0,flag); } public int DFS(int threshold, int rows, int cols,int x,int y,boolean[][] flag){ if(x < 0 || x >= rows || y < 0 || y >= cols || flag[x][y]||getSum(x)+getSum(y) > threshold){ return 0; } flag[x][y] = true; return 1 + DFS(threshold,rows,cols,x + 1,y,flag) + DFS(threshold,rows,cols,x - 1,y,flag) + DFS(threshold,rows,cols,x,y + 1,flag) + DFS(threshold,rows,cols,x,y - 1,flag); } public int getSum(int x){ int sum = 0; while(x>0){ sum += x%10; x/=10; } return sum; } }
二:
BFS广度优先遍历。
import java.util.LinkedList; public class Solution { class Pos{ int x; int y; Pos(int x,int y){ this.x = x; this.y = y; }; } public int movingCount(int threshold, int rows, int cols) { int count = 0; boolean[][] flag = new boolean[rows][cols]; LinkedList<Pos> list = new LinkedList<>(); if(judge(threshold,rows,cols,0,0,flag)){ flag[0][0] = true; list.add(new Pos(0,0)); } while(list.size()!=0){ Pos pos = list.pop(); int x = pos.x; int y = pos.y; count++; if(judge(threshold,rows,cols,x+1,y,flag)){ flag[x+1][y] = true; list.add(new Pos(x+1,y)); } if(judge(threshold,rows,cols,x-1,y,flag)){ flag[x-1][y] = true; list.add(new Pos(x-1,y)); } if(judge(threshold,rows,cols,x,y+1,flag)){ flag[x][y+1] = true; list.add(new Pos(x,y+1)); } if(judge(threshold,rows,cols,x,y-1,flag)){ flag[x][y-1] = true; list.add(new Pos(x,y-1)); } } return count; } public boolean judge(int threshold, int rows, int cols,int x,int y,boolean[][] flag){ if(x >= 0 && x < rows && y >= 0 && y < cols && !flag[x][y]){ if(getSum(x)+getSum(y) > threshold){ flag[x][y] = true; return false; } return true; } return false; } public int getSum(int x){ int sum = 0; while(x>0){ sum += x%10; x/=10; } return sum; } }