• ベストアンサー

配列の時間発展のアルゴリズム

javaのプログラムで配列で行き詰ってます。 まず、1×n列の配列をつくって箱の中にいくつか玉があるとします。各箱の中には1つしか玉はないものとします。最初は時間をtと置き、 1.玉の存在する各箱において、玉のコピーをつくる 2.コピーの中の一番左の玉を最も近い右の空き箱に移動させる 3.残りのコピーの中の一番左の玉を最も近い右の空き箱に移動させる 4.全てのコピーを移動させるまで3を繰り返す 5.もとの玉を消す ここで時間をt+1とします。配列の一番右端のn番目の次は1番目にループさせることにします。 箱玉系というものの動きなんですが、値を大きくするとうまく思った通りに動かなくて困ってます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

そう言えばそうですね。>kazsharpさん。 では、改造します。 // box[]をbox2[]に全部コピーする。 boolean[] box2 = (boolean[]) box.clone(); for (int i = 0; i < box2.length; i++) {  if (box2[i]) { // コピーの玉があったら   // 右方向に向かって空き箱を探す。   for (int j = 1; j < box.length; j++) {    int p = (i + j) % box.length;    if (! box[p]) {     // 空き箱を見つけたので玉を入れる(trueにする)     box[p] = true;     // 元の場所は玉を消す(falseにする)     box[i] = false;     // box2[i]はもう二度と調べないのでそのまま放置     break;    }   }  } } // この後 box2 はもう不要なのでメモリ解放 // (というか参照されないようにしてGCに解放を任せる)。 box2 = null;

kuropanda
質問者

お礼

ご指導ありがとうございました。なんとかプログラムが完成しました。

その他の回答 (2)

  • kazsharp
  • ベストアンサー率37% (16/43)
回答No.2

「思ったとおりに動かない」ということは「プログラムが間違ってる」ということです。 これ以上の回答をもとめるなら、どう上手く動かないのか説明するか、ソースを提示するべきでしょう。 ちなみに、No.1の方の回答では「元の玉を移動してtrueになった箱」の玉も移動するのではないのでしょうか? 「元の箱の配列」と別に「移動のための箱の配列」を用意してそこに移動後の玉を置く(trueにする)必要があると思います。

回答No.1

boolean[] box = new boolean[100]; というように配列が作ってあるとして、玉が入っている箱が true で入っていない箱が false だとすると、こんな風でいいんじゃないでしょうか。 for (int i = 0; i < box.length; i++) {  if (box[i]) { // 玉が入っている箱だったら   // 右方向に向かって空き箱を探す。   for (int j = 1; j < box.length; j++) {    int p = (i + j) % box.length;    if (! box[p]) {     // 空き箱を見つけたので玉を入れる(trueにする)     box[p] = true;     // 元の場所は玉を消す(falseにする)     box[i] = false;     break;    }   }  } } 一度に全ての玉をコピーしていませんが、これでも同じですよね?

関連するQ&A