- ベストアンサー
配列の時間発展のアルゴリズム
javaのプログラムで配列で行き詰ってます。 まず、1×n列の配列をつくって箱の中にいくつか玉があるとします。各箱の中には1つしか玉はないものとします。最初は時間をtと置き、 1.玉の存在する各箱において、玉のコピーをつくる 2.コピーの中の一番左の玉を最も近い右の空き箱に移動させる 3.残りのコピーの中の一番左の玉を最も近い右の空き箱に移動させる 4.全てのコピーを移動させるまで3を繰り返す 5.もとの玉を消す ここで時間をt+1とします。配列の一番右端のn番目の次は1番目にループさせることにします。 箱玉系というものの動きなんですが、値を大きくするとうまく思った通りに動かなくて困ってます。
- みんなの回答 (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;
その他の回答 (2)
- kazsharp
- ベストアンサー率37% (16/43)
「思ったとおりに動かない」ということは「プログラムが間違ってる」ということです。 これ以上の回答をもとめるなら、どう上手く動かないのか説明するか、ソースを提示するべきでしょう。 ちなみに、No.1の方の回答では「元の玉を移動してtrueになった箱」の玉も移動するのではないのでしょうか? 「元の箱の配列」と別に「移動のための箱の配列」を用意してそこに移動後の玉を置く(trueにする)必要があると思います。
- noboru2000
- ベストアンサー率33% (47/140)
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; } } } } 一度に全ての玉をコピーしていませんが、これでも同じですよね?
お礼
ご指導ありがとうございました。なんとかプログラムが完成しました。