79跳跃游戏 III(1306)

作者: Turbo时间限制: 1S章节: 宽度优先搜索

晚于: 2020-08-26 12:00:00后提交分数乘系数50%

截止日期: 2020-09-02 12:00:00

问题描述 :

这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。

请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。

注意,不管是什么情况下,你都无法跳到数组之外。

示例 1:

输入:arr = [4,2,3,0,3,1,2], start = 5

输出:true

解释:

到达值为 0 的下标 3 有以下可能方案: 

下标 5 -> 下标 4 -> 下标 1 -> 下标 3 

下标 5 -> 下标 6 -> 下标 4 -> 下标 1 -> 下标 3 

示例 2:

输入:arr = [4,2,3,0,3,1,2], start = 0

输出:true 

解释:

到达值为 0 的下标 3 有以下可能方案: 

下标 0 -> 下标 4 -> 下标 1 -> 下标 3

示例 3:

输入:arr = [3,0,2,1,2], start = 2

输出:false

解释:无法到达值为 0 的下标 1 处。 

输入说明 :

首先输入数组arr的长度n,

然后输入n个整数,以空格分隔。

最后输入整数start。

1 <= n <= 5 * 10^4

0 <= arr[i] < n

0 <= start < n

输出说明 :

输出true或false

输入范例 :

输出范例 :

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
    bool canReach(vector<int>& arr, int start) 
    {
        if(arr[start]==0)
            return true;
        queue<int> q;
        vector<bool> visited(arr.size(),"true");
        q.push(start);
        visited[start]=false;
        while(!q.empty())
        {
            int front=q.front();
            q.pop();
            if((front+arr[front])>=0&&(front+arr[front])<arr.size()&&visited[front+arr[front]])
            {
                if(arr[front+arr[front]]==0)
                    return true;
                q.push(front+arr[front]);
                visited[front+arr[front]]=false;
            }
            if((front-arr[front])>=0&&(front-arr[front])<arr.size()&&visited[front-arr[front]])
            {
                if(arr[front-arr[front]]==0)
                    return true;
                q.push(front-arr[front]);
                visited[front-arr[front]]=false;
            }
        }
        return false;
    }
};

int main()
{
    vector<int> arr;
    int n,data,k;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>data;
        arr.push_back(data);
    }
    cin>>k;
    bool result=Solution().canReach(arr,k);
    if(result)
        cout<<"true";
    else
        cout<<"false";
    return 0;
}
原文地址:https://www.cnblogs.com/zmmm/p/13654593.html