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

卵落としパズルのCプログラム-DP-11?


これは有名なパズルの問題です。 n階建ての建物があるとすると、m個の卵がある場合、卵を壊さずに安全に落とせる床を見つけるために必要な最小の滴数をどのように見つけることができますか。

覚えておくべき重要なポイントがいくつかあります-

  • 卵が特定の階から壊れない場合、それは下の階でも壊れません。
  • 特定の階から卵が割れる場合、上層階すべてで卵が割れる。
  • 卵が壊れたときは廃棄する必要があります。そうしないと、再び使用できます。

入力 -卵の数と最大フロア。卵の数が4で、最大フロアが10だとします。

出力 -最小試行回数4。

アルゴリズム

eggTrialCount(eggs、floors)

入力 −卵の数、最大フロア。

出力 −最小試行回数を取得します。

Begin
   define matrix of size [eggs+1, floors+1]
   for i:= 1 to eggs, do
      minTrial[i, 1] := 1
      minTrial[i, 0] := 0
   done
   for j := 1 to floors, do
      minTrial[1, j] := j
   done
   for i := 2 to eggs, do
      for j := 2 to floors, do
         minTrial[i, j] := ∞
         for k := 1 to j, do
            res := 1 + max of minTrial[i-1, k-1] and minTrial[i, j-k]
            if res < minTrial[i, j], then minTrial[i,j] := res
         done
      done
   done
   return minTrial[eggs, floors]
End

#include<stdio.h>
#define MAX_VAL 9999
int max(int a, int b) {
   return (a > b)? a: b;
}
int eggTrialCount(int eggs, int floors) { //minimum trials for worst case
   int minTrial[eggs+1][floors+1]; //to store minimum trials for i-th egg
   and jth floor
   int res, i, j, k;
   for (i = 1; i <= eggs; i++) { //one trial to check from first floor, and
      no trial for 0th floor
      minTrial[i][1] = 1;
      minTrial[i][0] = 0;
   }
   for (j = 1; j <= floors; j++) //when egg is 1, we need 1 trials for
      each floor
      minTrial[1][j] = j;
   for (i = 2; i <= eggs; i++){ //for 2 or more than 2 eggs
      for (j = 2; j <= floors; j++) { //for second or more than second
         floor
         minTrial[i][j] = MAX_VAL;
         for (k = 1; k <= j; k++) {
            res = 1 + max(minTrial[i-1][k-1], minTrial[i][j-k]);
            if (res < minTrial[i][j])
               minTrial[i][j] = res;
         }
      }
   }
   return minTrial[eggs][floors]; //number of trials for asked egg and
   floor
}
int main () {
   int egg, maxFloor;
   printf("Enter number of eggs: ");
   scanf("%d", &egg);
   printf("Enter max Floor: ");
   scanf("%d", &maxFloor);
   printf("Minimum number of trials: %d", eggTrialCount(egg, maxFloor));
}

出力

Enter number of eggs: 4
Enter max Floor: 10
Minimum number of trials: 4

  1. Cでのクリスマスツリーのプログラム

    ここで、1つの興味深い問題が発生します。この問題では、クリスマスツリーをランダムに印刷する方法を見ていきます。そのため、ツリーはクリスマスツリーのライトのようにちらつきます。 クリスマスツリーを印刷するために、さまざまなサイズのピラミッドを上下に並べて印刷します。装飾的な葉の場合、ランダムな文字が指定された文字のリストから印刷されます。高さとランダム性は調整可能です。 ここでは、ツリーを生成した後、画面全体がクリアされてから再度生成されます。そのため、これはちらつきツリーのように見えます。 例 #include <stdio.h> #include <stdlib.h&g

  2. 卵を落とすパズルのためのPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 − 40階建ての建物のどの階から卵を落とすのが安全で、どれが卵の助けを借りて着陸時に卵を損傷させるのかを知りたいとします。ストーリーを確認するには、最小数のトレイルを表示する必要があります。 次に、以下の実装のソリューションを見てみましょう- 例 # dynamic programming INT_MAX = 32767 # to get minimum trials def eggDrop(n, k):    # intialization    eggFloor