zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    jdbc代码
    openwrt vsftp
    openwrt 配置samba && ubuntu 配置samba
    如何学习开源项目
    Makefile 笔记
    Samba 学习笔记
    quilt-补丁工具
    to-do-list
    新增feeds模块
    linux命令
  • 原文地址:https://www.cnblogs.com/zmmm/p/13654593.html
Copyright © 2011-2022 走看看