|
> No.1983[元記事へ]
GAIさんへのお返事です。
> カードを3つ並びの数字(0,1,2,3の数で構成する。)で表す。
> 最初の数がカードのマーク(0→ダイヤ、1→クラブ、2→ハート、3→スペード)
> 次の2つがカードの数字を4進法表示したものになっています。
> 順番はカードを順序よく並べた状態で打ってあります。
> この52枚のカードを001(ダイヤの1に対応)からスタートさせて、
> 先頭の0を除く代わりに末尾に0,1,2,3(中には0をとれないカード番号もある。)のいずれかを取り入れて3つの並びの新たな下にあるカードを表す数字に飛んでいく。
プログラムは、処理が長くて終了していません。
途中経過では、42のようです。
LET M=4 !mシンボルのn文字単語
LET N=3
PUBLIC NUMERIC C !解の個数
LET C=0
PUBLIC NUMERIC X
LET X=0
DIM A(M^N+(N-1)),F(0 TO M^N-1) !列、遷移
MAT A=ZER
LET A(3)=1 !番号
MAT F=(-1)*CON
LET F(1)=0 !先頭が0,0,…,1 ※(n-2)個の0と1
CALL try(N+1,M,N,A,F)
END
EXTERNAL SUB try(p,M,N,A(),F())
FOR i=0 TO M-1
LET t=0 !m進数n桁を10進法へ
FOR J=N-1 TO 1 STEP -1
LET t=t*M+A(p-J)
NEXT J
LET t=t*M+i
IF F(t)<0 THEN !未使用なら
LET F(t)=p-N !使用中 ※正の値(=番号)
LET A(p)=i !p番目は数i
LET W=MOD(t,4^2) !カードの番号は1から13まで
IF W=0 OR W=14 OR W=15 THEN
IF p>X THEN !最大のもののみ
LET X=p
PRINT p !長さ
MAT PRINT A; !ドゥブリュエイン列
MAT PRINT F; !遷移
END IF
ELSE
CALL try(p+1,M,N,A,F) !次へ
END IF
LET F(t)=-1 !元に戻す
END IF
NEXT i
END SUB
実行結果
:
:
42
0 0 1 0 1 1 0 2 0 1 2 0 2 1 0 3 0 1 3 0 2 2 1 1 1 2 1 2 2 2 3 0 3 1 1 3 1 2 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-1 0 -1 -1 1 3 8 16 6 11 19 -1 14 31 -1 -1 39 2 5 13 4 22 23 33 9 24 26 36 17 34 -1 -1 -1 7 10 -1 12 21 25 -1 -1 20 27 28 29 37 -1 -1 -1 15 18 30 38 32 35 -1 -1 -1 -1 -1 -1 -1 -1 -1
:
:
|
|