溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++如何實(shí)現(xiàn)跳躍游戲

發(fā)布時(shí)間:2022-03-28 10:21:43 來(lái)源:億速云 閱讀:258 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“C++如何實(shí)現(xiàn)跳躍游戲”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“C++如何實(shí)現(xiàn)跳躍游戲”文章能幫助大家解決問(wèn)題。

Jump Game 跳躍游戲

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
jump length is 0, which makes it impossible to reach the last index.

這道題說(shuō)的是有一個(gè)非負(fù)整數(shù)的數(shù)組,每個(gè)數(shù)字表示在當(dāng)前位置的最大跳力(這里的跳力指的是在當(dāng)前位置為基礎(chǔ)上能到達(dá)的最遠(yuǎn)位置),求判斷能不能到達(dá)最后一個(gè)位置,開(kāi)始博主以為是必須剛好到達(dá)最后一個(gè)位置,超過(guò)了不算,其實(shí)是理解題意有誤,因?yàn)槊總€(gè)位置上的數(shù)字表示的是最大的跳力而不是像玩大富翁一樣搖骰子搖出幾一定要走幾。這里可以用動(dòng)態(tài)規(guī)劃 Dynamic Programming 來(lái)解,維護(hù)一個(gè)一維數(shù)組 dp,其中 dp[i] 表示達(dá)到i位置時(shí)剩余的跳力,若到達(dá)某個(gè)位置時(shí)跳力為負(fù)了,說(shuō)明無(wú)法到達(dá)該位置。接下來(lái)難點(diǎn)就是推導(dǎo)狀態(tài)轉(zhuǎn)移方程啦,想想啊,到達(dá)當(dāng)前位置的剩余跳力跟什么有關(guān)呢,其實(shí)是跟上一個(gè)位置的剩余跳力(dp 值)和上一個(gè)位置新的跳力(nums 數(shù)組中的值)有關(guān),這里新的跳力就是原數(shù)組中每個(gè)位置的數(shù)字,因?yàn)槠浯砹艘援?dāng)前位置為起點(diǎn)能到達(dá)的最遠(yuǎn)位置。所以當(dāng)前位置的剩余跳力(dp 值)和當(dāng)前位置新的跳力中的較大那個(gè)數(shù)決定了當(dāng)前能到的最遠(yuǎn)距離,而下一個(gè)位置的剩余跳力(dp 值)就等于當(dāng)前的這個(gè)較大值減去1,因?yàn)樾枰ㄒ粋€(gè)跳力到達(dá)下一個(gè)位置,所以就有狀態(tài)轉(zhuǎn)移方程了:dp[i] = max(dp[i - 1], nums[i - 1]) - 1,如果當(dāng)某一個(gè)時(shí)刻 dp 數(shù)組的值為負(fù)了,說(shuō)明無(wú)法抵達(dá)當(dāng)前位置,則直接返回 false,最后循環(huán)結(jié)束后直接返回 true  即可,參見(jiàn)代碼如下:

解法一:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        vector<int> dp(nums.size(), 0);
        for (int i = 1; i < nums.size(); ++i) {
            dp[i] = max(dp[i - 1], nums[i - 1]) - 1;
            if (dp[i] < 0) return false;
        }
        return true;
    }
};

其實(shí)這題最好的解法不是 DP,而是貪婪算法 Greedy Algorithm,因?yàn)檫@里并不是很關(guān)心每一個(gè)位置上的剩余步數(shù),而只希望知道能否到達(dá)末尾,也就是說(shuō)我們只對(duì)最遠(yuǎn)能到達(dá)的位置感興趣,所以維護(hù)一個(gè)變量 reach,表示最遠(yuǎn)能到達(dá)的位置,初始化為0。遍歷數(shù)組中每一個(gè)數(shù)字,如果當(dāng)前坐標(biāo)大于 reach 或者 reach 已經(jīng)抵達(dá)最后一個(gè)位置則跳出循環(huán),否則就更新 reach 的值為其和 i + nums[i] 中的較大值,其中 i + nums[i] 表示當(dāng)前位置能到達(dá)的最大位置,參見(jiàn)代碼如下:

解法二:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size(), reach = 0;
        for (int i = 0; i < n; ++i) {
            if (i > reach || reach >= n - 1) break;
            reach = max(reach, i + nums[i]);
        }
        return reach >= n - 1;
    }
};

關(guān)于“C++如何實(shí)現(xiàn)跳躍游戲”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI