|
> No.1936[元記事へ]
GAIさんへのお返事です。
> トランプの枚数がn枚のパケットがあり
> これを上から一枚ずつテーブルに左右に裏向きで配っていき2つの山を作っていく。
> 2つの山で、一方の山はテーブルから外す。
> 残った山で同様にカードを配り再び2つの山を作る。
> これを繰り返して一枚のカードを残す。
> このとき
> 最後にカードを配った方の山を除く場合を0、残す場合を1と表し
> 元のパケットのボトムからk番目のカードを最後まで残す為には
> いかなる戦略をとればよいかを調べたい。
LET N=15 !N枚のカード
LET K=2 !残すカードの位置(下からK枚目)
DIM P(N) !N枚のカードによるパケット ※P(1):上
FOR i=1 TO N !初期化
LET P(i)=N+1-i
NEXT i
LET C=0 !回数
LET NN=N
DO WHILE NN>1 !1枚になるまで
LET C=C+1
MAT PRINT P; !debug
DIM L(N),R(N) !2つに分ける
MAT L=ZER !並び
MAT R=ZER
LET LL=0 !枚数
LET RR=0
FOR i=1 TO NN
IF P(i)=K THEN LET KK=i !残すカードを確認する
IF MOD(i,2)=1 THEN !左の山へ
LET LL=LL+1
LET L(LL)=P(i)
ELSE !右の山へ
LET RR=RR+1
LET R(RR)=P(i)
END IF
NEXT i
CALL Reverse(L,LL) !実際の並び(上から)に合わせる
CALL Reverse(R,RR)
MAT PRINT L; !debug
MAT PRINT R;
!!PRINT NN;KK !debug
IF MOD(NN,2)=MOD(KK,2) THEN !最後のカードと同じ山にある場合
PRINT STR$(C);"回目の戦略=1" !残す!
IF MOD(NN,2)=1 THEN !左の山なら
LET NN=LL
MAT P=L
ELSE !右の山なら
LET NN=RR
MAT P=R
END IF
ELSE
PRINT STR$(C);"回目の戦略=0" !捨てる!
IF MOD(NN,2)=1 THEN
LET NN=RR
MAT P=R
ELSE
LET NN=LL
MAT P=L
END IF
END IF
PRINT
LOOP
END
EXTERNAL SUB Reverse(P(),N) !カードの位置を反転させる
!!MAT PRINT P; !debug
FOR i=1 TO INT(N/2) !半分を対象とする
LET t=P(i) !交換する
LET P(i)=P(N+1-i)
LET P(N+1-i)=t
NEXT i
!!MAT PRINT P; !debug
END SUB
実行結果 N=15,K=2の場合
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
1 3 5 7 9 11 13 15 0 0 0 0 0 0 0
2 4 6 8 10 12 14 0 0 0 0 0 0 0 0
1回目の戦略=0
2 4 6 8 10 12 14 0 0 0 0 0 0 0 0
14 10 6 2 0 0 0 0 0 0 0 0 0 0 0
12 8 4 0 0 0 0 0 0 0 0 0 0 0 0
2回目の戦略=1
14 10 6 2 0 0 0 0 0 0 0 0 0 0 0
6 14 0 0 0 0 0 0 0 0 0 0 0 0 0
2 10 0 0 0 0 0 0 0 0 0 0 0 0 0
3回目の戦略=1
2 10 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4回目の戦略=0
|
|