新しく発言する  EXIT  インデックスへ
置換(Permutation)の計算

  置換(Permutation)の計算 山中和義 2007/10/30 11:38:21  (修正1回)
  つづき 山中和義 2007/10/30 11:39:25  (修正1回)
   ├サンプル(あみだくじ、カードのシャッフル... 山中和義 2007/10/30 11:42:06  (修正2回)
   │└!置換行列 山中和義 2007/10/31 19:32:35 
   ├!15パズルをつくる 山中和義 2007/10/30 21:46:16  (修正3回)

Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2007/10/30 21:46:16 ** この記事は3回修正されてます
!15パズルをつくる

!main

LET N=4 !縦横の数 N×N
LET N2=N*N !空白のピース番号

DATA 1, 2, 3, 4 !初期値
DATA 5, 6, 7, 8
DATA 9,10,11,12
DATA 15,13,14,16 !※16は空白の意、空白は最後に!
!DATA 13,15,14,16
DIM p(N2) !ピースの配置
MAT READ p

CALL PrintOut(p) !結果を表示する

IF PermSign(p)<0 THEN !パリティチェック
PRINT "解法不能です。"
STOP
END IF

DIM op(N2) !置換で表す
DO
DO
INPUT pNo !移動するピース番号を指定する

IF pNo>0 AND pNo<N2 THEN !ピース番号なら
FOR i=1 TO UBOUND(p) !配置位置へ変換する
IF pNo=p(i) THEN EXIT FOR
NEXT i
LET x=i

IF x>N AND p(x-N)=N2 THEN EXIT DO !1つ上が空白なら移動させる
IF MOD(x,N)<>1 AND p(x-1)=N2 THEN EXIT DO !左
IF MOD(x,N)<>0 AND p(x+1)=N2 THEN EXIT DO !右
IF x<N2-N+1 AND p(x+N)=N2 THEN EXIT DO !下
END IF
LOOP

CALL PermTransposition(pNo,N2, op) !配置上での隣接交換
CALL PermMultiply(op,p,p)

CALL PrintOut(p) !結果を表示する

LOOP UNTIL PermIsIdentity(p)<0 !整列したら

PRINT "完成です!"


SUB PrintOut(p()) !配置を表示する
FOR i=1 TO N2
IF p(i)=N2 THEN PRINT " "; ELSE PRINT USING "###": p(i);
IF MOD(i,N)=0 THEN PRINT
NEXT i
END SUB

END

   └!ルービックキューブ(Rubik'scube、magicc... 山中和義 2007/11/01 21:07:01  (修正1回)
    └つづき 山中和義 2007/11/01 21:10:06  (修正1回)

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。