C++跳跃游戏之能否跳到某个位置(二)(DFS+BFS)

在这里插入图片描述
解题思路
DFS: 从起点开始用隐形递归栈深度优先搜索并且标记已经访问过的节点,如果任何一条路径遇到0就返回true,否则如果所有路径都没有0,返回false。

BFS: 从起点开始用队列宽度优先搜索(出度为2, 即cur + arr[cur], cur - arr[cur])并且标记已经访问过的节点,如果任何一条路径遇到0就返回true,否则如果所有路径都没有0,返回false。

代码

class Solution {//跳跃游戏3
    vector<int> map;
public:
    bool canReach(vector<int>& arr, int start) {//深度优先DFS
        map.resize(arr.size(), -1);
        return  jump(arr, start);
    }
    bool jump(vector<int>& arr, int start) {
        if (start < 0 || start >= arr.size())return false;
        if (!arr[start])return true;
        if (map[start] >= 0)return false;
        map[start]++;
        bool res1 = jump(arr, start + arr[start]);
        bool res2 = jump(arr, start - arr[start]);
        return res1 || res2;
    }
   
        
    
};
bool canReach(vector<int>& arr, int start) {//广度优先BFS
            vector<int> map(arr.size(), -1);
            queue<int> q{ {start} };
            while (!q.empty()) {
                int idx = q.front();
                q.pop();
                if (idx < 0 || idx >= arr.size() || map[idx] >= 0) {
                    continue;
                }
                if (arr[idx] == 0)return true;
                map[idx]++;
                q.push(idx + arr[idx]);
                q.push(idx - arr[idx]);
            }
            return false;
        }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值