- 締切済み
スリザーリンクの問題をランダムに生成するプログラム
題名のようなプログラムをC言語で書きたいと思います。 日本語としておかしいところがあったらすいません。 方針としては下図のような時計回りの矢印ブロックをつくり → ↑ ↓ ← 矢印の元を-1、1矢印の先を1としてつながったところが足して0になってループと判定し、これをどんどんつなげていって最終的に大きなループを作ろうと考えています。 スリザーリンクの問題として入り組んだループが生成されるように、二度目選択したときにはループを削除して凹凸やへこんだループを実現して、そのあと点対称、線対称にヒントとなる数字を書き入れていきたいと思います。 まず選択したマスを格納する配列と、矢印の向き(-1,1の情報)を格納する配列、ヒントの数字を格納する配列を用意してランダムに矢印のブロックを生成するプログラムを書いたのですが、凹凸やへこんだループのためのループ削除で複数のループができるようになってしまいました。 これを回避する条件など問題は山積みですが。 他にもっと良い方法やこうしたほうがいいよといったロジックなどあればご教示お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- ky072
- ベストアンサー率60% (85/140)
まず、データの持ち方について、次のようにしてはいかがでしょう。 ・ 「辺」のデータは持たない。 ・ マスの配列のみを持ち、ループの内側のマスを 1、外側のマスを 0 とする。 ・ 隣り合わせたマスの値が異なる場合に、 その境界にループを構成する線が引かれることになる。 ・ 1つのループになる条件は、以下2点。 (a) ループ内側(1)のマスが、途切れていない1つの連続した領域である。 (b) その領域に穴があいていない。 次に、入り組んだループにする方法ですが、 次のような手順で生成できるかもしれません。 (1) 盤面を全て 0 で埋める。 (2) 乱数で選んだ1つのマスを 1 にする。 (3) 盤面の 1 のマスの中から1つのマスを乱数で選ぶ。 (4) (3)で選んだ 1 のマスを起点にして、 隣接する 0 のマスの中から、 3方向が 0 に囲まれた 0 のマスを乱数で選ぶ。 選んだマスを 1 に変更し、そのマスに移動。 このように 0 の領域に向けて 1 の領域を拡張していく。 (5) 拡張できる隣接する 0 のマスが無い場合、(3) に戻る。 他にもいろいろと工夫が必要ですが、 おおまかな方針としては、こんな感じでいかがでしょう?
お礼
ご指摘ありがとうございます。 辺のマスはなくして、「辺は0と1の境界」のほうが自分にとってもわかりやすいですね 一度書き直してみたいと思います。ありがとうございます。