- ベストアンサー
ラテン方格での順列作成
- fortranでラテン方格を作るプログラムを作っていますが、縦方向で同じ数字を繰り返してしまいます。
- 現時点でのプログラムをプログラムは以下のとおりです。最終的には100×100ぐらいを作りたいと思っています。
- 参考にしたい結果は、縦方向に同じ数字を繰り返すことなく順列を作成することです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ANo.1の指摘どおり,縦方向にすでに登場している数字かどうかを判定する必要がありますから,1次元配列ではなく2次元配列を用いることになるでしょう。 しかし,乱数を使って数字を1つ当てはめた後それが規則に合っているか検査していく,なんて複雑ですよ。ja.Wikipediaによると, ラテン方格は、第1行および第1列が自然な順序で並んでいる場合に標準形という。 どんなラテン方格も行、または列を交換することで標準形にできる。 http://ja.wikipedia.org/wiki/ラテン方格 ということですから, 規則正しい標準形のラテン方陣をまず作っておいて,あとは乱数で行・列を決めて好きな回数だけ交換するのが良いのではないですか。全面全色そろったルービックキューブを先に用意しておき,好きな回数だけ行・列をランダムに崩していくイメージです。 FORTRANの実効環境が手元にないので,ある別のプログラム言語で,4×4の2次元配列中に規則正しい標準形のラテン方陣を作り出すコードを書いてみました。コード中の % は剰余演算子です。 ---------------------------------------- $n = 4; foreach $i (1..4) { $nn = $i; foreach $j (1..4) { $t[$i][$j] = $nn; $nn = ($nn % $n) + 1; } } foreach $i (1..4) { foreach $j (1..4) { print $t[$i][$j], " "; } print "\n"; } ---------------------------------------- これがどんなプログラム言語か知らなくても,アルゴリズムのイメージはつかめるのではないでしょうか。これを実行すると次のように出力されます。 ------------ 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 ------------
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
> 縦方向で同じ数字を繰り返してしまいます。 縦方向にすでに登場しているかどうかの判定をしないまま、 無条件に配列要素を入れ替えているところに問題があると思います。
お礼
ご回答ありがとうございます。 ご指摘のとおり縦方向の判定をしておりませんでした。 判定をしないでよい仕組みを考えます。
お礼
ご回答ありがとうございます。 ご指摘のとおり1行目に標準型を一度作ってそこからランダムにして、縦方向は1行ずれる毎に1列ずらすということで縦方向の重複がないようにすることとしました。 具体的なプログラムまで書いていただきありがとうございました。 大変参考になりました。