深度优先和广度优先的搜索

步骤:

  1. 模式识别:更适合广度优先还是深度优先
  2. 确定当前的状态,根据状态进行递归操作
  3. 确定递归的模式(可使用队列进行辅助)
  4. 查看是否需要记录状态

Example

机器人走路

  1. 地上有一个mn列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
  1. class Solution {
  2. int result = 0;
  3. boolean[][] map;
  4. public int movingCount(int m, int n, int k) {
  5. map = new boolean[m][n];
  6. //1.列出m,n的矩阵
  7. //2.写出计算函数
  8. //3.确定当前状态
  9. //4.进行递归,记录状态
  10. //结果进行计数
  11. //边界和极值0
  12. //递归
  13. f(0,0,m,n,k);
  14. return result;
  15. }
  16. public void f(int x, int y ,int m ,int n, int k){
  17. if(!checkLimit(x,y,m,n)) return;
  18. if(!checkSum(x,y,k)) return;
  19. result += 1;
  20. map[y][x] = true;
  21. f(x+1,y,m,n,k);
  22. f(x,y+1,m,n,k);
  23. f(x-1,y,m,n,k);
  24. f(x,y-1,m,n,k);
  25. }
  26. public boolean checkLimit(int x, int y, int m,int n){
  27. if(x<0 || x >= n) return false;
  28. if(y<0 || y>= m) return false;
  29. if(map[y][x]) return false;
  30. return true;
  31. }
  32. public boolean checkSum(int x ,int y, int k){
  33. int count = 0;
  34. while(x / 10 > 0){
  35. count += x % 10;
  36. x = x / 10;
  37. }
  38. count += x;
  39. while(y / 10 > 0){
  40. count += y%10;
  41. y = y / 10;
  42. }
  43. count += y;
  44. if(k < count) return false;
  45. return true;
  46. }
  47. }