NowCoder(2):袋鼠過河——搜狐2017校招編程題

題目描述:

一隻袋鼠要從河這邊跳到河對岸,河很寬,但是河中間打了很多樁子,每隔一米就有一個,每個樁子上都有一個彈簧,袋鼠跳到彈簧上就可以跳的更遠。每個彈簧力量不同,用一個數字代表它的力量,如果彈簧力量爲5,就代表袋鼠下一跳最多能夠跳5米,如果爲0,就會陷進去無法繼續跳躍。河流一共N米寬,袋鼠初始位置就在第一個彈簧上面,要跳到最後一個彈簧之後就算過河了,給定每個彈簧的力量,求袋鼠最少需要多少跳能夠到達對岸。如果無法到達輸出-1

輸入:

輸入分兩行,第一行是數組長度N (1 ≤ N ≤ 10000),第二行是每一項的值,用空格分隔。

輸出:

輸出最少的跳數,無法到達輸出-1

思路:

1.使用一個數組spiling來保存彈簧的彈力,另外一個N+1的數組來表示能夠達到當前的位置的最少步數,初始狀態下全部爲0,表示不能達到。
2.從初始位置開始,設置當前位置爲已經達到過了,從位置i +1到i+spiling[i]都是可以從位置i直接達到的,如果這些位置還沒有能夠達到過,或者是以前有更多的步數才能夠達到,就更新當前的位置步數steps[j] = steps[i] + 1;

代碼:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n, t;
    cin >> n;//輸入木樁的數量
    vector<int> spiling;//記錄木樁
    vector<int> steps(n + 1, 0);//記錄當前木樁需要最少多少步可以跳到
    for (int i = 0;i < n;i++)
    {
        cin >> t;
        spiling.push_back(t);
    }
    steps[0] = 1;
    for (int i = 0; i < n;i++)
    {
        for (int j = i + 1;j <= i + spiling[i] && j <= n;j++)
        {
            if (steps[i] != 0 && (steps[j] == 0 || steps[i] + 1 < steps[j]))//要確保當前的第i個木樁已經達到過了
                steps[j] = steps[i] + 1;//如果當前的第j個木樁還沒有能夠達到過,或者是當前可以找到更短的達到第j個木樁的方法,更新steps[j]
        }
    }
    if (steps[n])
        cout << steps[n] - 1;
    else
        cout << -1;
    system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章