新しく発言する  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回)
   └!ルービックキューブ(Rubik'scube、magicc... 山中和義 2007/11/01 21:07:01  (修正1回)

Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2007/11/01 21:07:01 ** この記事は1回修正されてます
!ルービックキューブ(Rubik's cube、magic cube)のシミュレーション

SUB PermIdentity(A()) !恒等置換
FOR i=1 TO UBOUND(A)
LET A(i)=i
NEXT i
END SUB
SUB PermCyclicToMatrix(C(), M(,)) !巡回置換の行列を得る
MAT M=IDN
FOR i=1 TO UBOUND(C)-1
LET M(C(i),C(i))=0
LET M(C(i),C(i+1))=1
NEXT i
LET M(C(i),C(i))=0
LET M(C(i),C(1))=1
END SUB


PICTURE PlotOut !展開図の表示(中央の配置を固定)
SET DRAW mode hidden !ちらつき防止(開始)
CLEAR
DRAW plane(1) WITH SHIFT(3,3) !正面
DRAW plane(9) WITH SHIFT(9,3) !裏面
DRAW plane(17) WITH SHIFT(3,6) !上面
DRAW plane(25) WITH SHIFT(3,0) !下面
DRAW plane(33) WITH SHIFT(0,3) !左面
DRAW plane(41) WITH SHIFT(6,3) !右面
SET DRAW mode explicit !ちらつき防止(終了)
END PICTURE
PICTURE plane(n) !n番目から始まる1面(3×3)を表示する
FOR i=0 TO 3 !前半
SET AREA COLOR INT((B(n+i)-1)/8)+2 !色
DRAW block(STR$(B(n+i))) WITH SHIFT(MOD(i,3),INT(i/3))
NEXT i
SET AREA COLOR INT((n-1)/8)+2 !中央
DRAW block(s$(INT((n-1)/8)+1)) WITH SHIFT(MOD(4,3),INT(4/3))
FOR i=5 TO 8 !後半
SET AREA COLOR INT((B(n+i-1)-1)/8)+2 !色
DRAW block(STR$(B(n+i-1))) WITH SHIFT(MOD(i,3),INT(i/3))
NEXT i
END PICTURE
PICTURE block(n$) !ブロックの表示
PLOT AREA: 0,0; 1,0; 1,1; 0,1
PLOT LINES: 0,0; 1,0; 1,1; 0,1; 0,0 !縁
SET TEXT HEIGHT 0.5 !番号
PLOT TEXT ,AT 0.2,0.2: n$
END PICTURE


!main

SET WINDOW -0.1,1.3, -0.3,1.1!表示領域を設定する

DIM B(48),savB(48) !ブロックの配置
CALL PermIdentity(B) !整列させる
MAT savB=B

DIM s$(7) !メニュー項目
DATA "正","裏","上","下","左","右","1つ戻す"
MAT READ s$

DO
DRAW PlotOut WITH SCALE(0.1) !結果を表示する

LOCATE CHOICE(s$): p !メニューを選択する

IF p=7 THEN
MAT B=savB !戻す
ELSE
MAT savB=B
CALL op(p) !回転する
END IF
PRINT s$(p) !トレース
LOOP

SUB op(p) !操作
IF p=1 THEN RESTORE 100 !各面の回転
IF p=2 THEN RESTORE 200
IF p=3 THEN RESTORE 300
IF p=4 THEN RESTORE 400
IF p=5 THEN RESTORE 500
IF p=6 THEN RESTORE 600

DIM C(4),M(48,48) !巡回置換、置換行列
MAT M=IDN
FOR k=1 TO 5 !5つで1組
MAT READ C !巡回置換を読み込む
CALL PermCyclicToMatrix(C, M) !対応する行列へ
MAT B=M*B !置換
NEXT k
END SUB

    └つづき 山中和義 2007/11/01 21:10:06  (修正1回)

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