- ベストアンサー
要素を選択していくプログラムについて
配列 a[12]={9,10,11,8,1,2,0,5,4,6,7,3} b[12]={2,0,10,5,8,7,9,11,6,1,3,4} の2つがあった場合、 各配列の初めから両隣の要素をそれぞれ番号ごとのリストに追加します。 この作業をa,bの配列の最後の要素まで繰り返します。 例. (aの配列の初めの要素9の場合→両隣の要素は左側3、右側10なので 9の箇所に3と10を追加する。 次、10の場合→両隣の要素は左側9、右側11なので10の箇所に9と11を追加する。 aの配列の最後の要素3の場合→左側7、右側9なので3の箇所に7と9を追加する。) 作業の結果のリスト 0:{2,5,10} 1:{8,2,6,3} 2:{1,0,4} 3:{7,9,1,4} 4:{5,6,3,2} 5:{0,4,10,8} 6:{4,7,11,1} 7:{6,3,8,9} 8:{11,1,5,7} 9:{3,10,7,11} 10:{9,11,0,5} 11:{10,8,9,6} 以上のようになります。 ここから (1)一番短いリストを選びます。 (ここでは0と2のリストが要素数が3つしかないのでランダムでどちらか選ぶ。 仮に0を選択したとする。) 0→ (2)次に0を選んだので0~11までのリストの中から0を全て消します。 (0を消した事によりリストの長さが変わります。) (3)0の中のリストの中の要素2,5,10を見てこの中でリストの一番短いリストを選びます。 (ここでは2が一番リストが短いので(先ほど0を消したのでリストの長さ2)2を選ぶ。) 0→2→ (4)2を選んだので0~11までのリストの中か2を全て消す。 (5)2の中のリストの中の要素1,4を見てこの中でリストの一番短いリストを選びます。 (ここでは1と4のリストの長さが等しいのでランダムでどちらかを選ぶ。) 0→2→1 (4)に戻り、同様の作業を繰り返します。 0→2→1→8→5→4→6→7→3→9→10→11 最終的に↑のような結果を得たいのですが、色々考えてみたのですが全然できません。 どなたか教えて頂けないでしょうか?(もしくはヒントだけでも頂けたら助かります。) よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
やり方はいろいろあると思いますが、例えば、 0:{2,5,10} を、Cなら struct list { int len; /* 長さ */ int *pArray; /* { 2, 5, 8 } のような配列の先頭を指すポインタ */ }; C++なら class list { int len; /* 長さ */ int *pArray; /* { 2, 5, 8 } のような配列の先頭を指すポインタ */ }; のように定義します。長さが不定なので、int *pArray; としましたが、最大の長さが決まっているなら int Array[100]; のような配列でもよいと思います。 そして、{ a,b,... } の中から n を削除する関数(Cの場合)、あるいはメソッド(C++の場合)を作成し(その中で len-- する。) 0:{2,5,10} 1:{8,2,6,3} ... 11:{10,8,9,6} は、この構造体、あるいはクラスの配列として宣言します。( struct list a[12]; のような感じ) これで少しはすっきりするんじゃないでしょうか。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
個人的には12*12の2次元配列を使用して結果を格納するかな? で、あらかじめ配列は初期化しておき、 >各配列の初めから両隣の要素をそれぞれ番号ごとのリストに追加します。 >この作業をa,bの配列の最後の要素まで繰り返します。 という作業では、結果は格納する配列にフラグを立てるようにすれば、重複の結果を取り除く手間が省けます。 例:0の場合、2と5と10なので、 {0,0,1,0,0,1,0,0,0,0,1,0} となる。
お礼
アドバイスありがとうございます。 今回は、 {0,0,1,0,0,1,0,0,0,0,1,0} の代わりに {2,5,10}として他に要素の数を記憶する配列を用いて作りましたが、作る上でとても参考になりました。 ありがとうございました。
お礼
アドバイスを参考にして要素の数を覚えておくような配列を使用してなんとかできました。 そこで削除する関数を用意して要素の数を減らしました。 ほんとうに助かりました。 ありがとうございました。
補足
言語に何を使うのかを書き忘れていました。 すみません。プログラムはCで作る予定です。 さっそくのアドバイスありがとうございます。 ひとまずご助言の通り作ってみたいとおもいます。