T1 12. 矩阵中的路径
深度优先搜索(DFS)+ 剪枝
char[] toCharArray() | 将此字符串转换为一个新的字符数组。 |
---|
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for(int i=0;i<board.length;i++){ //行
for(int j=0;j<board[0].length;j++){ //列
if(dfs(board,words,i,j,0)) return true; //递归查询
}
}
return false;
}
public boolean dfs(char[][] board,char[] words,int i,int j,int k){
//越界,或者当前字符和words[k]不相等
if(i<0 || j<0 || i>=board.length || j>=board[0].length || board[i][j]!=words[k]) return false;
//已经找到所有word字符
if(k == words.length-1) return true;
//此次路径找到的位置所在字符标记为空,防止重复
board[i][j] = '\0';
//按上下左右继续递归
boolean res = dfs(board,words,i-1,j,k+1)||dfs(board,words,i+1,j,k+1)||dfs(board,words,i,j-1,k+1)||dfs(board,words,i,j+1,k+1);
//递归后复原该位置的值,可能有其他路径符合条件
board[i][j] = words[k];
return res;
}
}
T2 13. 机器人的运动范围
本题 0<m,n<100 所有数位和十位加个位
由于机器人每次只走一步,优化数位和计算
11,12,13,14,15,16,17,18,19,20,21,22 … | |
---|---|
2, 3, 4, 5, 6 , 7, 8, 9, 10, 2, 3, 4… |
进位的项和前一项差8,非进位的项和前一位项大1
广度优先 BFS
poll() 方法都是从队列中删除第一个元素 | poll() 方法在用空集合调用时不是抛出异常,只是返回 null |
---|
class Solution {
public int movingCount(int m, int n, int k) {
int res = 0; //可走格子数
boolean[][] vist = new boolean[m][n]; //每个格子的可行性
Queue<int[]> queue = new LinkedList<int[]>();
queue.add(new int[]{0,0,0,0}); //行,列,行的数项和,列的数项和
while(queue.size()>0){
int[] x = queue.poll(); //出队
int i=x[0],j=x[1],si=x[2],sj=x[3];
//越界,数列的数项和超过,不可行的格子直接到下次循环
if(i>=m || j>=n || si+sj>k || vist[i][j]) continue;
vist[i][j] = true;
res++;
//向右和向下的格子加入队列
queue.add(new int[]{i ,j+1 ,si , (j+1)%10==0 ? sj-8:sj+1});
queue.add(new int[]{i+1,j,((i+1)%10==0?si-8:si+1),sj});
}
return res;
}
}