置換(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回)