【dfs】机器人的运动范围

本文探讨了深度优先搜索(DFS)算法在路径计数问题中的应用,强调了使用vis数组跟踪已访问节点的重要性,并解释了如何正确计算可达格子数量。通过一个示例问题,介绍了AC代码实现细节,包括全局变量的初始化和递归调用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大致思路:

显然用dfs,但是我没注意到:

①dfs也要vis数组!!!而且,我其实常用的是第一次传第一个点进去,所以要在主函数里先把第一个点的vis设1!!!!

②也是本题的重点:问的是“能够到达多少个格子”,这个意思不是说一条路径上最多能有多少个格子,而是若干条路径上,只要能走到就算!所以,这里并不是在dfs前先vis=1,之后就立刻vis=0。因为:以前的思路是另一条路线可以去走其他路线走过的,但是这里的话,是全局来看的,所以走过就是走过,就不要再走,所以不用再让vis=0了!

——所以,这里也不是去更新什么最大值maxx,而是只要走到一个点,就maxx++

③很奇怪。。。牛客网oj在全局设vis数组并没有默认全部为0,我真是醉了,为了保险,还是在主函数里把数组初始化为全0吧,默不默认的真的不好说。。。。

AC代码:

class Solution {
public:
    int maxx=0;
    int xx[4]={-1,1,0,0};
    int yy[4]={0,0,-1,1};
    int vis[500][500];
    int row,col;
    int movingCount(int threshold, int rows, int cols)
    {
        if(threshold<0)
            return 0;
        for(int i=0;i<500;i++)
            for(int j=0;j<500;j++)
                vis[i][j]=0;
        row=rows;
        col=cols;
        vis[0][0]=1;
        dfs(0,0,threshold);
        return maxx;
    }

    
    void dfs(int x,int y,int k) //当前在(x,y).
    {
        maxx++;
        for(int i=0;i<4;i++) //四个方向去找可以走的
        {
            int xxx=x+xx[i];
            int yyy=y+yy[i];
            if(xxx<0 || xxx>=row || yyy<0 || yyy>=col || vis[xxx][yyy]==1 || xxx/10+xxx%10+yyy/10+yyy%10>k)
                continue;
            vis[xxx][yyy]=1;
            dfs(xxx,yyy,k);
        }
    }
    
};





 

### BFS 和 DFS 算法的 Java 实现模板 #### ### 一、DFS(深度优先搜索) 深度优先搜索是一种类似于树的前序遍历的方法,它通过递归的方式不断深入到某个路径直到无法继续为止。以下是基于栈或递归实现的 DFS 模板: ```java // 使用递归方式实现 DFS 的通用模板 public void dfs(int node, List<List<Integer>> adjacencyList, boolean[] visited) { if (visited[node]) return; visited[node] = true; // 访问当前节点并标记为已访问 System.out.println(node); // 处理当前节点逻辑(如打印) for (int neighbor : adjacencyList.get(node)) { // 遍历相邻节点 if (!visited[neighbor]) { // 如果未被访问,则递归调用 dfs(neighbor, adjacencyList, visited); } } } ``` 上述代码展示了如何利用递归来完成图的深度优先遍历[^1]。 如果需要手动模拟堆栈操作而非使用递归,可以采用以下方法: ```java // 基于显式栈的手动 DFS 实现 public void iterativeDfs(int startNode, List<List<Integer>> adjacencyList, boolean[] visited) { Stack<Integer> stack = new Stack<>(); stack.push(startNode); while (!stack.isEmpty()) { int currentNode = stack.pop(); if (visited[currentNode]) continue; visited[currentNode] = true; // 标记为已访问 System.out.println(currentNode); // 当前节点处理逻辑 for (int neighbor : adjacencyList.get(currentNode)) { // 将邻居压入栈中 if (!visited[neighbor]) { stack.push(neighbor); } } } } ``` 此版本适用于那些希望避免深递归导致栈溢出的情况[^2]。 --- #### ### 二、BFS(广度优先搜索) 广度优先搜索通常借助队列来逐层扩展节点。下面是一个标准的 BFS 模板: ```java import java.util.*; public class BfsExample { public void bfs(int startNode, List<List<Integer>> adjacencyList, boolean[] visited) { Queue<Integer> queue = new LinkedList<>(); // 创建队列用于存储待访问节点 queue.add(startNode); while (!queue.isEmpty()) { int currentNode = queue.poll(); // 取出队首元素 if (visited[currentNode]) continue; // 已经访问过则跳过 visited[currentNode] = true; // 否则将其标记为已访问 System.out.println(currentNode); // 对当前节点执行所需的操作 for (int neighbor : adjacencyList.get(currentNode)) { // 添加所有未访问过的邻接点至队列 if (!visited[neighbor]) { queue.add(neighbor); } } } } } ``` 这段代码清晰地体现了广度优先搜索的核心思想——按照层次顺序依次探索每一个节点[^3]。 --- #### ### 三、应用场景举例 - **宫问题**:可以通过 BFS 寻找最短路径;而 DFS 则适合验证是否存在某种特定通路。 - **机器人运动范围**:给定网格地图以及障碍物位置,计算可达区域面积等问题可分别用两种算法解决[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值