C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

カエルが家に着くための最小ジャンプを見つけるためのC++コード


nビットの2進文字列Sと別の数dがあるとします。数直線上で、カエルはポイント1から開始してポイントnに到達しようとしています。カエルはd以下の距離で右にジャンプできます。ユリの花がある場合は1からnまでの各ポイントについて、1としてマークされ、ない場合は0としてマークされます。カエルはユリのいるポイントでのみジャンプできます。カエルがnに到達するために必要なジャンプの最小数を見つける必要があります。不可能な場合は、-1を返します。

したがって、入力がS="10010101"のような場合。 d =4の場合、出力は2になります。これは、位置1から4にジャンプし、次にインデックス8(n)にジャンプするためです。

ステップ

これを解決するには、次の手順に従います-

n := size of s
x := 0
y := 0
while (x < n - 1 and y <= n), do:
   if s[x] is same as '1', then:
      x := x + d
      increase y by 1
   Otherwise
      (decrease x by 1)
if y >= n, then:
   return -1
Otherwise
   return y

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
int solve(string s, int d){
   int n = s.size();
   int x = 0, y = 0;
   while (x < n - 1 && y <= n){
      if (s[x] == '1')
         x += d, ++y;
      else
         --x;
   }
   if (y >= n)
      return -1;
   else
      return y;
}
int main(){
   string S = "10010101";
   int d = 4;
   cout << solve(S, d) << endl;
}

入力

"10010101", 4

出力

2

  1. C++で無限の線上でターゲットに到達するための最小の動きを見つけます

    無限の数直線に数直線があるとします。 (-infから+ inf)。 0から始めて、説明したように移動してターゲットに到達する必要があります。 i番目の移動では、左または右のいずれかのステップに進むことができます。必要な最小移動数を見つける必要があります。ターゲットが2であるとすると、最小ステップは3になります。0から1まで、1から-1まで、および-1から2まで。 この問題を解決するために、覚えておくべき重要なポイントがいくつかあります。ターゲットが負の場合、数直線が同じであるため、これを正と見なします。解決するために、アイデアは可能な限り一方向に移動します。したがって、0から1に移動し、1か

  2. Pythonで家にたどり着くための最小限のジャンプを見つけるプログラム

    forbiddenという配列があるとします。ここで、forbidden [i]は、バグがforbidden [i]の位置にジャンプできないことを示し、a、b、xの3つの値もあります。バグの家は数直線のxの位置にあります。最初は位置0にあります。ルールに従うことでジャンプできます- バグは正確に右の位置にジャンプする可能性があります。 バグは正確にb位置左にジャンプする可能性があります。 バグは2回続けて後方にジャンプすることはできません。 バグは、配列で指定された禁止位置にジャンプできません。 バグはホームを超えて前方にジャンプできますが、負の値で番号付けされた位