1

私はこの方法で数日間立ち往生しています。このメソッドは、サイコロ 5 個の出目 == スモール ストレートかどうかをチェックします。いくつかの数値で機能します。私が転がすと

1、2、4、3、6

それが動作します。ただし、ロールすると

1、2、4、3、3

効果がないでしょう。そこに 3 が重複しているためだと思います。どうにかして最後まで動かさねば。

小さなストレートは、1、2、3、4 または 3、4、5、6 など、4 つの連続したサイコロの値がある場合です。2、3、1、4 などの任意の順序にすることができます。

      int counter = 0;
      int score = 0;
      boolean found = false;
      Arrays.sort(die);

      for (int i = 0; i < die.length - 1; i++)
      {
          if (counter == 3)
              found = true;

          if (die[i + 1] == die[i] + 1)
          {
              counter++;
          }
          else if (die[i + 1] == die[i])
          {
              continue;
          }
          else
          {
              counter = 0;
          }
      }

      if (found)
      {
         score = 30; 
      }
      else
      {
          score = 0;
      }
      return score;
    }
4

3 に答える 3

2

重複した 3 は、アルゴリズムから脱落しているものではありません。問題は、ストレートが発生した後の反復中にストレートをチェックすることです。したがって、最後のサイコロがストレートの一部である場合、それは認識されません。

これを修正するには、移動します

if (counter == 3) found = true;

ループの END まで。動作するはずです。

編集:だから、このように見えます。

for (/*...*/) {
  /* Everything else */

  if (counter == 3) {
      found = true;
      break;
  }
}
于 2013-03-27T23:51:40.943 に答える
1

編集: まず、スモール ストレートが 3 連続である場合、カウンターが 3 ではなく 2 になるかどうかを確認します。3 は 4 連続を要求します。

for ループの開始を次のように編集します。

  for (int i = 0; i < die.length ; i++)
  {
      if (counter == 2)
          found = true;
      if (i == die.length - 1) break;
      //method continues here

理由: このメソッドのコーディングを開始したときIndexOutOfBoundsException、配列の最後のサイコロに到達したときに s をスローし、それを存在しない 6 番目のサイコロと比較しようとして死亡したと想像します。それで、ループストップを 1 つ短くしました。しかし、それが 1 つのショートを停止し、最後のダイスで小さなストレートが終了した場合、カウンターが 3 で小さなストレートが発生したことを確認するために再びループに入ることはありません。ループの開始をこのように編集することで、最後の要素まで進み、チェックしてから中断します。

または、ループの終了後に最後のチェックを行います。

  for (int i = 0; i < die.length - 1; i++)
  {
      if (counter == 2)
          found = true;
      if (die[i + 1] == die[i] + 1)
      {
          counter++;
      }
      else if (die[i + 1] == die[i])
      {
          continue;
      }
      else
      {
          counter = 0;
      }
  }

  found = (counter == 2); // or counter >= 2 if you want larger straights to be found too

  //continue method here
于 2013-03-27T23:51:29.530 に答える
0

これにより、最長のシーケンスが計算されます。

int longestSequence(int[] a) {
  Arrays.sort(a);
  int longest = 0;
  int sequence = 0;
  for (int i = 1; i < a.length; i++) {
    int d = a[i] - a[i - 1];
    switch (d) {
      case 0:
           // Ignore duplicates.
           break;
      case 1:
           sequence += 1;
           break;
      default:
           if (sequence > longest) {
             longest = sequence;
           }
           break;
    }
  }
  return Math.max(longest, sequence);
}
于 2013-03-28T00:10:55.407 に答える