dfs和bfs

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

import java.util.concurrent.*;
import java.util.*;
public class Solution {
    int num = 0;
    public int movingCount(int threshold, int rows, int cols)
    {
        //下右上左
        int[] step = {-1, 0, 1, 0, -1};
        
        //记录足迹
        int[][] mark = new int[rows][cols];
        
        //深搜
        //dfs(0, 0, threshold, step, mark, rows, cols);
        
        //广搜
        bfs(0, 0, threshold, step, mark, rows, cols);
        return num;
    }
    
    private void dfs(int r, int c, int k, int[] step, int[][] mark,
                    int rs, int cs){
        
        if(r < 0 || c < 0 || check(r) + check(c) > k || r >= rs || 
          c >= cs || mark[r][c] == 1){
            return;
        }
        mark[r][c] = 1;
        num++;
        for(int i = 0; i < 4; i++){
            dfs(r + step[i], c + step[i + 1], k, step, mark, rs, cs);
        }
         
    }
    
    private static class Node{
        int x; int y;
    }
    
    private void bfs(int r, int c, int k, int[] step, int[][] mark,
                    int rs, int cs){
        if(r < 0 || c < 0 || check(r) + check(c) > k || r >= rs || 
          c >= cs || mark[r][c] == 1){
            return;
        }
        //借助队列实现广搜
        Queue<Node> q = new LinkedBlockingQueue();
        Node node = new Node();
        node.x = r;
        node.y = c;
        mark[r][c] = 1;
        q.add(node);
        
        while(!q.isEmpty()){
            Node cur = q.poll();
            num ++;
            for(int i = 0; i < 4; i++){

                int cr = cur.x + step[i];
                int cc = cur.y + step[i + 1];

                if(cr < 0 || cc < 0 || check(cr) + check(cc) > k ||
                   cr >= rs || cc >= cs || mark[cr][cc] == 1){
                    continue;
                }
                mark[cr][cc] = 1;
                Node no = new Node();
                no.x = cr;
                no.y = cc;
                q.add(no);
            }
        }
        
    }
    
    private int check(int n){
        int num = 0;
        while(n != 0){
            num += (n % 10);
            n /= 10;
        }
        return num;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值