剑指offer java day14 搜索与回溯算法

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值