圆圈中的最大跳跃达到零

时间:2015-08-10 08:32:28

标签: c++ arrays algorithm

爱丽丝正在玩一款游戏,她按照以下规则从一块石头跳到另一块石头:

  1. 圆圈中有n个岩石

  2. 每个摇滚都标有一个数字,告诉她跳跃的长度

  3. 每次她跳到下一个岩石时,她跳跃的岩石数量减少了一个

  4. 当她到达标有0

  5. 的岩石时,她停止跳跃
  6. 可以向前或向后跳转

  7. 一旦你选择了一个向这个方向跳跃的方向

  8. 现在给出一个代表岩石的数组。我们需要从任何可能的位置开始计算她可以行驶的最大路径。

    示例设N = 2,跳跃数组为[1,2],此处答案为4。

    说明:绘制一个圆圈并假设该圆圈两侧各有两块岩石。现在想象爱丽丝站在标有1的岩石上。这意味着她必须跳出1号长度,让她离开她的下一块岩石(在这种情况下,如果她向前或向后跳跃,它会让她留在岩石2但我们假设她这次正在向前跳)并且数组现在是[0,2]。由于她现在站在岩石2,她将跳跃长度2,让她在岩石2(现在将标记为1)。 现在她有了这个数组:[0,1]并且她的最后一次跳跃从1到0。 所以最终数组为[0,0],她进行了4次跳跃(1 + 2 + 1)。

    我的尝试:

    192.168.2.0/24

    但它为解释的输入提供3而不是4.请帮助找到解决此问题的方法

2 个答案:

答案 0 :(得分:1)

目前,您拥有以下界限:

    for(int k = i; j[k] != 0;) {
       if(k >= o.size()) // This test is misplaced, we already access `j[k]`
          k -= o.size();

       int t = k;

       k += j[k]; // `k` may be out of bound here.
       --j[t];
       y++; // as noted, you score here number of jump and not length of path
    }

您可以将功能拆分为较小的部分,如下所示:

enum Direction
{
    Backward = -1,
    Forward = 1
};

int jump(std::vector<int> rocks, int start, Direction dir) {
    int score = 0;
    for(int i = start; rocks[i] != 0;) {
        score += rocks[i];
        int new_i = i + dir * rocks[i];
        while (new_i < 0) {
            new_i += rocks.size();
        }
        while (new_i >= rocks.size()) {
            new_i -= rocks.size();
        }
        --rocks[i];
        i = new_i;
    }
    return score;
}

int jump(const std::vector<int>& rocks) {
    int best = 0;
    for(int i = 0; i < rocks.size(); i++) {
        const int score_backward = jump(rocks, i, Direction::Backward);
        const int score_forward = jump(rocks, i, Direction::Forward);

        best = std::max({best, score_backward, score_forward});
    }
  return best;
}

Live Demo

允许

  • 更具人类可读性
  • 到(unit-)只测试一个跳跃分数

答案 1 :(得分:0)

您想计算跳跃次数(3)还是跳跃距离(4)?

你的问题在这一点上并不清楚。

如果你想计算跳跃次数,你似乎得到了正确答案。

如果要计算距离,则应更改:

       --j[t];
       y++;

       y += j[t];
       --j[t];