|
> No.3403[元記事へ]
GAIさんへのお返事です。
> どうかこの配列を探し出して下さい。
紹介された
数列のサイト や 添付された文書
7ページ 表6
より、計4回では!?
n=13は困難(n=12が4時間なので、3日程度が予想される)のため、
DATA文を切り替えて、計13回実行します。
分担すると負担が軽減されるので、1,2,3,…を確認してください。
5,6,7にはありません。私は、8,9,…と確認してみます。
LET t0=TIME
DATA 1,2,3,4,5,6,7,8,9,10,11,12,13
!!DATA 2,1,3,4,5,6,7,8,9,10,11,12,13
!!DATA 3,1,2,4,5,6,7,8,9,10,11,12,13
!!DATA 4,1,2,3,5,6,7,8,9,10,11,12,13
!!DATA 5,1,2,3,4,6,7,8,9,10,11,12,13 !済み
!!DATA 6,1,2,3,4,5,7,8,9,10,11,12,13 !済み
!!DATA 7,1,2,3,4,5,6,8,9,10,11,12,13 !済み
!!DATA 8,1,2,3,4,5,6,7,9,10,11,12,13
!!DATA 9,1,2,3,4,5,6,7,8,10,11,12,13
!!DATA 10,1,2,3,4,5,6,7,8,9,11,12,13
!!DATA 11,1,2,3,4,5,6,7,8,9,10,12,13
!!DATA 12,1,2,3,4,5,6,7,8,9,10,11,13
!!DATA 13,1,2,3,4,5,6,7,8,9,10,11,12
DIM A(13)
MAT READ A
PUBLIC NUMERIC C !場合の数
LET C=0
CALL perm(A,2) !※先頭を固定する
PRINT C; "通り"
PRINT TIME-t0
END
EXTERNAL SUB perm(a(),n) !1からnまでの順列を生成する(辞書式でない)
LET m=UBOUND(a)
IF n=m THEN !すべて並んだなら
!!!MAT PRINT a; !debug
LET X=0
CALL stub2(1,m,a, X)
IF X-1=4 THEN !回数 ※ ←←←←←←←←←←
LET C=C+1
PRINT "No.";C
MAT PRINT A; !束の並び(左側が上とする)
END IF
ELSE
FOR i=n TO m !箇所を設定する
LET t=a(n) !a[n]とa[i]を入れ替える
LET a(n)=a(i)
LET a(i)=t
CALL perm(a,n+1) !次へ
LET t=a(n) !元に戻す
LET a(n)=a(i)
LET a(i)=t
NEXT i
END IF
END SUB
EXTERNAL SUB stub2(L,N,A(), X) !シミュレーション
DIM B(N),Q(N)
MAT B=A !copy it
LET M=N
LET P=0
LET K=0
DO WHILE K<N !1からnまで数える
DO !束の一番上
LET P=P+1 !p=[1,N]
IF P>N THEN LET P=1
LOOP UNTIL B(P)>0
LET K=K+1
IF B(P)=K THEN !一致するカード
LET Q(N-M+1)=K !場の並び
LET B(P)=-1 !取り除く
LET M=M-1
IF M=0 THEN !カードがすべてなくなったなら
CALL stub2(L+1,N,Q, X) !連続で可能かどうか
EXIT SUB
END IF
LET K=0
END IF
LOOP
LET X=L !L回目がNG
END SUB
n=11までなら、n!通りを直接処理しても現実的なので、次のようになります。
LET N=11 !枚数 ※ ←←←←←←←←←←
DIM A(N) !並び n!通り
FOR i=1 TO N !最初の並び 1,2,3,…,n
LET A(i)=i
NEXT i
PUBLIC NUMERIC C !場合の数
LET C=0
CALL perm(A,1)
PRINT C; "通り"
END
:以下、同じなので省略する
|
|