数の十字形問題の考察(2)を紹介します。
考察(2)
プログラムによる解の探索を考察する。
を解とすると、
縦列①、②、④、⑤は入れ替えても同じ。
したがって、①<②<④<⑤という条件をつける。
横列⑥、⑦、⑧、⑨も入れ替えても同じ。
したがって、⑥<⑦<⑧<⑨という条件をつける。
縦列と横列を入れ替えても同じ。
したがって、①<⑥という条件をつける。
●プログラム(CT111.bas)
' << CT111.bas >> ' Tiny Basic ' ' 数の十字形問題を解くプログラム。 ' Public N: ' nの値。 Public M: ' 列の合計値。 Public R: ' rの値。 Public COUNT: ' 部分順列の個数。 Public P(10): ' 部分順列を保存する配列 ' ' 初期設定。 N=9 R=9 ' Do ' 列の合計値Mの読み込み。 Read M If M <= 0 Then Exit Do ' ' 初期設定。 COUNT=0 For I=1 To N: P(I)=I: Next I ' ' 部分順列の生成。 Call Perm (1) Print"列の和=";M;" 解の個数:";COUNT Print Loop End ' ' 部分順列を生成する手続き。 ' Kは部分順列K番目の要素を意味する。 Sub Perm(K) If K = 6 Then S=P(1)+P(2)+P(3)+P(4)+P(5) If S <> M Then Exit Sub ' 条件①<②<④<⑤を満たさなければ、戻る。 If P(1) > P(2) Then Exit Sub If P(2) > P(4) Then Exit Sub If P(4) > P(5) Then Exit Sub End If ' If K > R Then S=P(6)+P(7)+P(3)+P(8)+P(9) If S <> M Then Exit Sub ' ' 条件⑥<⑦<⑧<⑨を満たさなければ、戻る。 If P(6) > P(7) Then Exit Sub If P(7) > P(8) Then Exit Sub If P(8) > P(9) Then Exit Sub ' 条件①<⑥を満たさなければ、戻る。 If P(1) > P(6) Then Exit Sub ' ' 解の表示。 COUNT=COUNT+1 Print Using"[###]";COUNT; For I=1 To R: Print Using"##";P(I);: Next I Print Exit Sub End If ' ' つぎの位置の要素を指定する。 For I=K To N W=P(K): P(K)=P(I): P(I)=W Call Perm(K+1) W=P(K): P(K)=P(I): P(I)=W Next I End Sub ' ' データ。 Data 23, 24, 25, 26, 27, 0
実行結果