碁石、順列
こんばんわ。
つい最近 別件で質問させていただいたばかりですが、
またプログラミングに関して 解決できないことがありまして
ここに来ました(汗)
タイトルの通りの問題なのですが、
何個かある碁石の中から いくつか取り出して、それを並べる
には 何通りの順列がありうるかを算出するプログラムを
作りたいのですが、
たとえば 白が2個、黒が2個あったとして
そこからランダムに3個とった場合について説明
させていただきます。
今書いているプログラムは、
ランダムに取り出してきた3個を
choice[]という配列に格納します。
そして、順列ですから 重複してはいけないということで
今まで生成した順列にかぶるものがないか 確認できなければ
いけないので、重複のないように、今までに選んだ3個の並びを
stock[][]という二次元配列に格納していくようにしました。
ここが問題になっています。ここでバグがおきていて(私の
無知により間違った記述をしているためと思われますが、)
for(i=0;i<5;i++){
for(j=0;j<3;j++){
stock[i][j] = choice[j];
}
}
printf("stock:%s\n",stock[0]);
*stock[i][j]は、あらかじめ'E'で初期化をしております。
上記のように書きました。
これは、選択した3つが入ったchoice[j]を、stockの中に
同じものがないかを確認して、なければ代入する という感じで
書いたものです。
で、printf文は、stock[0]つまり stock[0][0]~stock[0][2]
を表示させて、choiceと同じ3つが入っているか確認したかった
ためなのですが、
choiceがWBB(白、黒、黒の意味)のとき
stock:WBBEEEEEEEEEEEE
と表示されてしまいます。
私は、stock:WBB
となることを期待していたのですが。。。
で、たとえば次に選択した3つがBWBだとしたら
前にストックしたWBBとは違うから またstock[][]に代入する
ことにして、
stock[1]が、BWB となるようにしたいのです。
そうやって貯めていければ、たとえば 上記のように
2回目に選択したとき、
choiceが stock[][]の中にあるものと、一致したら
重複順列だからカウントしない
というようなことができるのですが、
そもそもstockへの入り方が期待したものと違い
よくわからないことになっているものですから、
すべて、”一致していない”のほうを通ってしまい、
正常に実行できないでおります。
いったい、何を勘違いしており、どのようにすれば
解決できるのでしょうか(>_<)
どなたかアドバイスいただけますでしょうか。
お手数ですが、よろしくお願いいたしますm(_ _)m
お礼
知りたいことが、色々わかりました。 有難うございます。 日本棋院と、関西棋院 関東棋院はないのに、関西棋院があるのは、関西らしいです。